您的位置:首页 > 其它

使用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("商品");
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: