使用lock&condition实现生产者消费者
2015-09-29 20:43
525 查看
package com.lei.lock; /* *jdk 1.5提供了升级解决方案:提供了显示的锁机制以及显示的对象上等待唤醒机制,将同步synchronized替换成了lock()操作 *将wait notify() 替换为condition对象 *该对象可以通过lock锁进行获取 ,优点是一个锁可以绑定若干个condition. *该示例中实现了本方只唤醒对方 *在1.5之前一个锁只能有一个wait notify(),notifyall()可能会总是唤醒自己的生产线程。 *如果有多个,原来的一旦锁嵌套,容易产生死锁 */ import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Resource { private String name; private int count = -1; private boolean flag = false;//已经有数据则为true,没有则为false private Lock lock = new ReentrantLock();// wait notify需要放在同步语句中 private Condition condition_pro = lock.newCondition(); private Condition condition_con = lock.newCondition(); public void set(String name) { lock.lock();// 拿到设备锁 try { while (this.flag) this.condition_pro.await();//一旦等待则释放锁,等待的是被signal,而不是等待锁,一旦被signal之后则获取资源锁。 this.name = name + "--" + count++; System.out.println(Thread.currentThread().getName() + "..生产者.." + this.name);// 当前线程的名称 this.flag = true; this.condition_con.signalAll();//唤醒消费者线程 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { this.lock.unlock();// 释放锁 一定要执行 } } public void out() { this.lock.lock(); try {/* 下面的代码:while (!this.flag)原因 * condition的功能类似于在传统线程技术中的Object.wait和Object.notify功能。 * 在等待Condition时候,允许发生“虚假唤醒”,这通常作为对基础平台语义上的让步,对于大多数的应用程序, * 这实际带来的影响很小,因为Conditon应该总是在一个循环中被等待,并测试正被等待的状态生命。某个实现可以随意移除 可能的虚假唤醒,但建议应用程序员总是假定这些虚假唤醒可能发生,因此总是在一个循环中等待。*/ while (!this.flag)// 没有数据,则等待 this.condition_con.await(); System.out.println(Thread.currentThread().getName() + "...." + "消费者..." + this.name); flag = false; this.condition_pro.signalAll();//唤醒的都是对方 } catch (InterruptedException e) { e.printStackTrace(); } finally { this.lock.unlock();// 释放锁 一定要执行 } } }
public class Producer implements Runnable { private Resource res; public Producer(Resource r) { this.res=r; } public void run() { while(true) { this.res.set("商品"); } } }
相关文章推荐
- hdu 5455__Fang Fang
- iOS中各种动画分类
- Java程序执行Linux命令
- Number of Digit One
- 是否需要有代码规范
- 【基础练习】【倍增LCA】codevs1036 商务旅行题解
- wpf 关于鼠标换轮放大缩小只有120的问题
- Nginx配置&负载均衡实战
- 封装SlideQQ样式
- HDU 5479(栈的应用)
- redis导库
- android学习-----Fragment
- 9.13~9.30刷题(shui)题解
- SAX操作XML
- mac下tomcat的安装与配置
- axis webservice
- 由appcampat 的思考
- 实验一 认识DOS
- 每天代码五十行,今天第二天.
- MySQL 可以用localhost 连接,但不能用IP连接的问题