持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天
多线程进阶-JUC
3.Lock锁(重点)
lock接口
公平锁:十分公平,可以先来后测
非公平锁: 十分不公平,可以插队 (默认)
public class SaleTicketDemo02 {
public static void main(String[] args) {
//多线程操作
//并发:多线程操作同一个资源类,把资源类丢入线程
Ticket2 ticket = new Ticket2();
new Thread(()->{for(int i=0;i<40;i++) ticket.sale(); },"A").start();
new Thread(()->{for(int i=0;i<40;i++) ticket.sale(); },"B").start();
new Thread(()->{for(int i=0;i<40;i++) ticket.sale(); },"C").start();
}
}
//lock三部曲
//1、 Lock lock=new ReentrantLock();
//2、 lock.lock() 加锁
//3、 finally=> 解锁:lock.unlock();
class Ticket2{
private int number=50;
Lock lock=new ReentrantLock();
//卖票的方式
// 使用Lock 锁
public void sale(){
//加锁
lock.lock();
try {
//业务代码
if(number>=0){
System.out.println(Thread.currentThread().getName()+" 卖出了第"+number+" 张票,剩余:"+number+" 张票");
number--;
}
}catch (Exception e) {
e.printStackTrace();
}
finally {
//解锁
lock.unlock();
}
}
}
synchronize和Lock的区别
1.Synchronize 内置的java关键字 , Lock是一个java类
2.Synchronize 无法判断获取锁的状态,Lock 可以判断是否获得了锁
3.Synchronize 会自动释放锁,lock必须手动释放锁! 如果不释放锁,会死锁
4.Synchronize 线程1(获得锁,阻塞)、线程2(等待,傻傻的等);Lock锁就不一定会等待下去
5.Synchronize 可重入锁,不可以中断的,非公平;Lock,可重入锁,可判断,非公平(可以自己设置)
6.Synchronize 适合锁少量的代码同步问题 ; Lock适合锁大量的同步代码
锁是什么?如何判断锁的是谁?
4、生产者和消费者问题
什么是生产者消费者模型? 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的。
我们首先举个例子便于理解生产者消费者模型:
我们平常都会去超市买一些需要的物品,给我们提供产品的是供应商,我们是消费者,我们是去超市消费,给我们提供产品的而是供应商,为什么我们会去超市呢?因为超市给我们提供了交易场所,生产者消费者模型本质是生产者把产品放到超市里面,消费者把产品从超市中拿出去。
计算机中的数据相当于产品,数据的加工处理是CPU以任务形式加工处理,生产者和消费者代表的是多线程或者多进程,超市相当于一段内存
生活中生产者将产品放在一个交易场所,让我们自己去拿,为什么这样呢?是因为效率高,比如菜鸟驿站的场景,快递公司把一批包裹放进菜鸟驿站,然后我们去拿就好了,提高了效率
厂商将交易场所当作缓冲区来用,生产者和消费者一般是进程和线程,空间或者交易场所:一块"内存块",产品相当于数据
生产者消费者321原则(自己总结:3种关系,2种角色。一个交易场所):
3种关系,生产者和生产者,生产者和消费者,消费者和消费者
生产者和生产者竞争关系(互斥),生产者和消费者(同步),消费者和消费者竞争关系(互斥)
2种角色,生产者和消费者
面试高频问题:
单例模式,排序算法,生产者和消费者模式,死锁
生产者和消费者问题Synchronize 版
线程之间的通信问题:生产者和消费者问题! 线程等待、 线程唤醒
线程交替执行:A B 操作同一个变量 num= 0
a: num+ 1 ;
b: num -1 ;
模式关键字:判断等待、业务、通知
JUC版的生产者和消费者问题
通过lock找到Condition