Java多线程知识点总结——进阶篇(八) 之 等待唤醒机制 Lock 锁升级版
2018-03-31 16:14
375 查看
JDK1.5 中提供了多线程升级解决方案。
将同步 Synchronized 替换成现实 Lock 操作。
将Object中的 wait、notify、notifyAll,替换成了Condition 对象。该对象可以对 Lock 锁进行获取。该示例中,实现了本方只唤醒对方操作。
Lock: 替代了 Synchronized,关键API有:
lock ()
unlock()
newCondition()
Condition:替代了Object wait notify notifyAll,关键API有:
await()
signal()
signalAll()
将上一篇文章的代码通过 Lock 锁进行升级,升级后的代码如下:
将同步 Synchronized 替换成现实 Lock 操作。
将Object中的 wait、notify、notifyAll,替换成了Condition 对象。该对象可以对 Lock 锁进行获取。该示例中,实现了本方只唤醒对方操作。
Lock: 替代了 Synchronized,关键API有:
lock ()
unlock()
newCondition()
Condition:替代了Object wait notify notifyAll,关键API有:
await()
signal()
signalAll()
将上一篇文章的代码通过 Lock 锁进行升级,升级后的代码如下:
import java.util.concurrent.locks.*; import java.util.concurrent.locks.Lock; class ProducerConsumerDemo2 { public static void main(String[] args) { Resource r = new Resource(); Producer pro = new Producer(r); Consumer con = new Consumer(r); new Thread(pro).start(); new Thread(pro).start(); new Thread(con).start(); new Thread(con).start(); } } class Resource { private String name; private int count = 1; private boolean flag = false; private Lock lock = new ReentrantLock(); private Condition condition_pro = lock.newCondition(); private Condition condition_con = lock.newCondition(); public void set(String name) throws InterruptedException { lock.lock(); try { while (flag) condition_pro.await(); this.name = name + "--" + count++; System.out.println(Thread.currentThread().getName() + "...生产者.." + this.name); flag = true; condition_con.signal();//只唤醒 producer 的线程 } finally { lock.unlock();//释放锁的动作一定要执行。 } } public void out() throws InterruptedException { lock.lock(); try { while (!flag) condition_con.await(); System.out.println(Thread.currentThread().getName() + "...消费者........." + this.name); flag = false; condition_pro.signal();//只唤醒 Consumer 的线程 } finally { lock.unlock();//释放锁的动作一定要执行。 } } } class Producer implements Runnable { private Resource res; Producer(Resource res) { this.res = res; } public void run() { while (true) { try { res.set("+商品+"); } catch (InterruptedException e) { } } } } class Consumer implements Runnable { private Resource res; Consumer(Resource res) { this.res = res; } public void run() { while (true) { try { res.out(); } catch (InterruptedException e) { } } } }
相关文章推荐
- Java多线程知识点总结——进阶篇(七) 之 等待唤醒机制
- Java多线程生产者消费者说明等待唤醒机制问题和虚假唤醒问题
- 多线程__【线程间通信】【等待唤醒机制】【多生产多消费】【Lock&Condition接口】
- 【JavaSE学习笔记】多线程02_Lock,死锁,等待唤醒机制,线程组和线程池,Timer定时器
- 黑马程序员_九 【线程间通信】【等待唤醒机制】【JDK1.5线程新特性】【其他知识点】
- 多线程__【线程间通信】【等待唤醒机制】【多生产多消费】【Lock&Condition接口】
- java多线程通信之等待唤醒机制
- Java基础 多线程 解决安全问题 等待唤醒机制 Lock Condition interrupt join setPriority yield
- 多线程(6)等待唤醒机制Lock,condition
- 黑马程序员——线程中等待唤醒机制及jdk5版本lock的深入思考
- 24 API-多线程(多线程(多线程JDK5Lock锁,生产者消费者等待唤醒机制,定时器),设计模式(设计原则,设计模式(简单工程,工厂方法,单例模式)
- 黑马程序员_java的多线程进阶(对第十二课等待唤醒机制和生产消费总结)
- 线程通信-等待和唤醒机制和锁(Lock)机制
- day12线程间的通信,等待唤醒机制,生产者消费者问题。新锁lock(): 守护线程,interrupt()停止线程用,join()yield()
- 多线程的等待唤醒机制和Lock锁
- Java多线程知识点总结——进阶篇(六) 之 死锁
- Java多线程知识点总结——进阶篇(九) 之 停止线程
- java多线程---等待/唤醒以及生产者消费者经典同步Lock的实现
- 线程间通信、等待唤醒机制、生产者消费者问题(Lock,Condition)、停止线程和守护线程、线程优先级
- java多线程-线程间通信-示例代码-解决安全问题-等待唤醒机制wait()notify()notifyAll()