JUC-LOCK接口
Synchronized
1、多线程编程模版上
(1)线程 操作 资源类
(2)高内聚低耦合
2、实现步骤
(1)创建资源类
(2)资源类里创建同步方法,同步代码块
3、例子:卖票
LOCK 接口
锁实现提供了比使用同步方法和语句可以获得的更广泛的锁操作。它们允许更灵活的结构,可能具有非常不同的属性,并且可能支持多个关联的条件对象。
1、Lock接口的实现 ReentrantLock可重入锁
(1)如何使用?
class X {
private final ReentrantLock lock = new ReentrantLock();
// ...
public void m() {
lock.lock(); // block until condition holds
try {
// ... method body
} finally {
lock.unlock()
}
}
}
2、创建线程方式
(1)继承Thread
public class SaleTicket extends Thread java是 单继承,资源宝贵,要用接口方式
(2)new Thread()
Thread t1 = new Thread();
t1 .start();
(3)Thread(Runnable target, String name) 「最好使用第三种」
3、实现Runnable方法
(1)新建类实现runnable接口
class MyThread implements Runnable //新建类实现runnable接口
new Thread( new MyThread ,...)
这种方法会新增类,有更新更好的方法
(2)匿名内部类
new Thread(
new Runnable() {
@Override
public void run() {
}
}, "your thread name" ).start(); 这种方法不需要创建新的类,可以new接口
(3)lambda表达式
new Thread(() -> {
}, "your thread name" ).start();
这种方法代码更简洁精炼
package com.atguigu.thread;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class Ticket //实例例eld +method
{
private int number=30;
/* //1同步 public synchronized void sale()
{//2同步 synchronized(this) {}
if(number > 0) {
System.out.println(Thread.currentThread().getName()+"卖出"+(number--)+"\t 还剩number);
}
}*/
// Lock implementations provide more extensive locking operations
// than can be obtained using synchronized methods and statements.
private Lock lock = new ReentrantLock();//List list = new ArrayList()
public void sale()
{
lock.lock();
try {
if(number > 0) {
System.out.println(Thread.currentThread().getName()+"卖出"+(number--)+"\t 还剩number);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
/**
*
* @Description:卖票程序个售票出 0张票
@author xiale
* 笔记:J里面如何 1 多线程编-上
1.1 线程 (资里源类 * 1.2 高内聚 /
public class SaleTicket
{
public static void main(String[] args)//main所有程序
Ticket ticket = new Ticket();
//Thread(Runnable target, String name) Allocates a new Thread object.
new Thread(() -> {for (int i = 1; i < 40; i++)ticket.sale();}, "AA").start();
new Thread(() -> {for (int i = 1; i < 40; i++)ticket.sale();}, "BB").start();
new Thread(() -> {for (int i = 1; i < 40; i++)ticket.sale();}, "CC").start();
/* new Thread(new Runnable() {
@Override
public void run()
{
for (int i = 1; i <=40; i++)
{
ticket.sale();
}
}
}, "AA").start();
new Thread(new Runnable() {
@Override
public void run()
{
for (int i = 1; i <=40; i++)
{
ticket.sale();
}
}
}, "BB").start();
new Thread(new Runnable() {
@Override
public void run()
{
for (int i = 1; i <=40; i++)
{
ticket.sale();
}
}
}, "CC").start();
*/
}
}
//1 class MyThread implements Runnable
//2 匿名内部类
//3 laExpress
JUC-LOCK接口的更多相关文章
- JUC之Lock接口以及Synchronized回顾
Lock接口 Synchronized关键字回顾: 多线程编程步骤(上): 创建资源类,在资源类创建属性和操作方法 创建多个线程,调用资源类的操作方法 创建线程的四种方式: 继承Thread 实现Ru ...
- 【JDK1.8】JUC.Lock综述
一.前言 前段时间结束了jdk1.8集合框架的源码阅读,在过年的这段时间里,一直在准备JUC(java.util.concurrent)的源码阅读.平时接触的并发场景开发并不很多,但是有网络的地方,就 ...
- Java中的Lock接口
Synchronized & Lock synchronized 是Java语言中的关键字,由monitorenter,monitorexit两个指令实现.JVM会将monitorenter指 ...
- 多线程之Lock接口
之前写了一下synchronized关键字的一点东西,那么除了synchronized可以加锁外,JUC(java.util.concurrent)提供的Lock接口也可以实现加锁解锁的功能. 看完本 ...
- synchronized关键字,Lock接口以及可重入锁ReentrantLock
多线程环境下,必须考虑线程同步的问题,这是因为多个线程同时访问变量或者资源时会有线程争用,比如A线程读取了一个变量,B线程也读取了这个变量,然后他们同时对这个变量做了修改,写回到内存中,由于是同时做修 ...
- 线程同步 Lock接口
同步:★★★★★ 好处:解决了线程安全问题. 弊端:相对降低性能,因为判断锁需要消耗资源,产生了死锁. 定义同步是有前提的: 1,必须要有两个或者两个以上的线程,才需要同步. 2,多个线程必须保证使用 ...
- Java基础知识强化之多线程笔记06:Lock接口 (区别于Synchronized块)
1. 简介 我们讲到了如何使用关键字synchronized来实现同步访问.本文我们继续来探讨这个问题,从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式 ...
- Java多线程(五) Lock接口,ReentranctLock,ReentrantReadWriteLock
在JDK5里面,提供了一个Lock接口.该接口通过底层框架的形式为设计更面向对象.可更加细粒度控制线程代码.更灵活控制线程通信提供了基础.实现Lock接口且使用得比较多的是可重入锁(Reentrant ...
- jdk1.5多线程Lock接口及Condition接口
jdk1.5多线程的实现的方式: jdk1.5之前对锁的操作是隐式的 synchronized(对象) //获取锁 { } //释放锁 jdk1.5锁的操作是显示的:在包java.util.concu ...
- Java多线程的~~~Lock接口和ReentrantLock使用
在多线程开发.除了synchronized这个keyword外,我们还通过Lock接口来实现这样的效果.由Lock接口来实现 这样的多线程加锁效果的优点是非常的灵活,我们不在须要对整个函数加锁,并且能 ...
随机推荐
- go笔记--几个例子理解context的作用
目录 go笔记--几个例子理解context的作用 context interface 先看一个简单的例程 context的作用 contxt相关函数 go笔记--几个例子理解context的作用 经 ...
- 通过shell模拟redis-trib.rb info的输出
需求:模拟redis-trib.rb info ip:port输出的结果 如: [redis@lxd-vm3 ~]$ redis-trib.rb info 5.5.5.101:29001 /usr/l ...
- 【编译原理】TEST递归下降演示
MyUtil.java package Util; import Value_Final.RRule; public class MyUtil { /** * 判断字符串是否是关键字 * @param ...
- Uva1363(余数性质/减少枚举量)
题意: 输入正整数n和k(范围均为1e9),求∑(k mod i),i从1~n 解法: 首先这道题直接暴力亲测会超时. 之后我们写几组数据之后可以发现当k/i的商相同的时候他们的余数成一个等差数列,而 ...
- js 时间格式转换
js时间格式转换 格式化时间转成时间戳 //格式化转时间戳(单位秒) function strtotime(strtime) { strtime = strtime.substring(0, 19); ...
- py 二级习题(重新输出文本-----每行一句话)
#需要的一小段文本 txt = "人生得意须尽欢,莫使金樽空对月.天生我才必有用,千金散尽还复来." #对文本进行分割,转换成列表形式 def txt_split(txt): li ...
- 【PHP】使用PHP抓取Bing每日图像并为己所用
Bing搜索的首页每天都会推送一张很漂亮的图片,把它保存下来,当做电脑桌面或是自己的网站背景图还不是美滋滋…… 今天的bing图片是这样的 既然要抓取这张图片,首先就得弄清这张图是从何而来的.经过对必 ...
- equals 为什么要把常量写在前面?
看例子 使用str1.equals("abc"); 如果str1是null,空是没有equals方法的,会抛出空指针异常 如果"abc".equals(str1 ...
- 0级搭建类011-Oracle Linux 7.x安装(OEL 7.7) 公开
项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...
- Win10下安装tensorflow详细过程
首先声明几点: 安装tensorflow是基于Python的,并且需要从Anaconda仓库中下载. 所以我们的步骤是:先下载Anaconda,再在Anaconda中安装一个Python,(你的电脑里 ...