Java生产者_Java实现生产者消费者

方法1:最简单--利用LinkedBlockingQueue

队列具有先进先出的特点,成为经常应用于生产-消费者模式的数据结构。

1.将一个对象放到队列尾部,如果队列已满,就等待直到有空闲节点。 ——put()方法

2.从队列头部取一个对象,如果没有对象,就等待直到有对象可取。 ——take()方法

3.在存取队列的过程中,锁定队列对象,不允许其它线程访问队列。——使得它是线程安全的

下面的代码适用于多个生产者、多个消费者。

ContractedBlock.gif Pruducer.java

ContractedBlock.gif Consumer.java

ContractedBlock.gif Main.java

方法2:不采用BlockingQueue,利用lock、Condition来实现

思路:

利用可重用的LinkedList来存放资源,生产者addLast(),消费者removeFirst()。

使用ReentrantLock()来实现消费者和生产者的同步;//可重用的互斥锁

思考:为什么使用了lock后,还使用了它的2个newCondition,这样做有什么好处?

ContractedBlock.gif ProducerConsumer .java

关于Java线程的lock、condition、synchronized的小小总结:

1.synchronized简单易用,但是功能受局限,无法满足复杂的同步机制,比如“读者写者问题”:多个读者线程是不互斥的。

2.lock以更优雅的方式来解决线程同步,比如读写锁ReadWriteLock。

3.Condition解决线程间通信,为不同的线程建立不同的条件。

Condition可以替代传统的线程间通信,用await()替换wait(),用signal()替换notify(),用signalAll()替换notifyAll()。

——为什么方法名不直接叫wait()/notify()/nofityAll()?因为Object的这几个方法是final的,不可重写!

Condition实现了BlockingQueue的功能。

看看BlockingQueue的继承和实现。

181036509273179.png

一般的锁Lock的实现:注意ReadLock、WriteLock是内部的静态类,只有ReentrantReadWriteLock类可以调用。

180946327879836.png

读写的锁ReadWriteLock

180943360062012.png

思考:OS的信号量是什么,线程通信的方式有哪些?共享变量和消息传递。

信号量与互斥锁有什么联系?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值