多线程——用Lock(锁)和Condition(监听器)来优化生产者消费者模式(进一步优化,解决可能产生的死锁问题)
2016-08-20 16:19
309 查看
package com.qianfeng.demo02 ; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 之前解决本方唤醒对方的问题是唤醒了线程池中全部线程。 * 缺点:这样做可以实现,但是效率比较低,而且还唤醒了本方。 * * 升级之后lock和condition就能解决这个问题。 * 之前是两个锁嵌套可能出现死锁的问题,现在的解决方案是只有一个锁,但是锁上面可以加入多个监视器。 * 一个用来监视生成者,一个用来监视消费者。 * * */ //资源 class Resource{ private String name; private int count = 1; private boolean flag; //判断盘子里是否有馒头的标志位。 //指定一把锁 private Lock lock = new ReentrantLock(); //获取锁的监视器 private Condition pro_con = lock.newCondition(); //负责监视生产者 private Condition cus_con = lock.newCondition(); //负责监视消费者 public void set(String name){ //获取锁 lock.lock(); try { while (flag) { try { pro_con.await(); } catch (InterruptedException e) { e.printStackTrace(); } } this.name = name+count; count++; System.out.println(Thread.currentThread().getName()+"....生产了..."+this.name); flag = true; cus_con.signal(); } catch (Exception e) { e.printStackTrace(); }finally { lock.unlock(); //释放锁 } } public void get(){ lock.lock(); try { while (!flag) { try { cus_con.await(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println(Thread.currentThread().getName()+"....消费了..."+this.name); flag = false; pro_con.signal(); } catch (Exception e) { // TODO: handle exception }finally { lock.unlock(); } } } //生产者 class Produce implements Runnable{ private Resource r; public Produce (Resource r) { this.r = r; } @Override public void run() { while (true) { r.set("馒头"); } } } //消费者 class Customer implements Runnable{ private Resource r; public Customer (Resource r) { this.r = r; } @Override public void run() { while (true) { r.get(); } } } public class LockDemo02 { public static void main(String[] args) { Resource r = new Resource (); Produce p = new Produce (r); Customer c = new Customer (r); Thread t0 = new Thread(p); Thread t1 = new Thread(p); Thread t = new Thread(c); Thread t3 = new Thread(c); t0.start(); t1.start(); t .start(); t3.start(); } }
相关文章推荐
- java 多线程学习之多生产者多消费者产生的线程安全问题分析与解决:Lock和Condition
- 多线程——用Lock(锁)和Condition(监听器)来优化生产者消费者模式
- Java基础 多线程 解决安全问题 等待唤醒机制 Lock Condition interrupt join setPriority yield
- 如何解决多线程程序中的死锁问题(转)
- java学习日记(6)____多线程的安全问题与死锁的产生
- 使用ld的“-Ttext”选项时可能产生的一个问题的解决方法
- 卸载IE7可能产生的几个问题以及解决方法
- 解决“当前命令发生了严重错误。应放弃任何可能产生的结果。”的问题
- 由不同编号生成策略产生的多线程问题及解决
- 线程经典问题 生产者消费者 jdk 1.5后解决办法 lock 和condition
- 如何解决多线程程序中的死锁问题
- 在web.xml中注册IntrospectorCleanupListener监听器以解决struts等框架可能产生的内存泄露问题
- 在web.xml中注册IntrospectorCleanupListener监听器以解决struts等框架可能产生的内存泄露问题
- 解决Android多线程访问SQLite数据库死锁问题
- 在web.xml中注册IntrospectorCleanupListener监听器以解决struts等框架可能产生的内存泄露问题
- 解决"当前命令发生了严重错误。应放弃任何可能产生的结果。"的问题
- 解决"当前命令发生了严重错误。应放弃任何可能产生的结果。"的问题
- Java笔记1 : 在生产者消费者模式中,线程通信与共享数据,死锁问题与解决办法
- 在web.xml中注册IntrospectorCleanupListener监听器以解决struts等框架可能产生的内存泄露问题
- 在web.xml中注册IntrospectorCleanupListener监听器以解决struts等框架可能产生的内存泄露问题