JDK5.0之后提供了两个接口Lock和Condition,简化同步和锁编程
java.util.concurrent.locks.Lock ----取代synchronized
java.util.concurrent.locks.Condition ------取代waite和notify
优势:
(1) Lock比传统线程模型中的synchronized方式更加面向对象
(2) Condition的功能类似在传统线程技术中的Object wait和Object notify功能
(3) 一个锁内部可以有多个Condition,即有多路等待和通知
案例:用Lock&Condition改造生产者消费者模型
/*
* 共享类
*/
class CubbyHole {
public final int SIZE=10;//仓库容量
private String[] nameArr={"苹果","香蕉","葡萄","橘子","橙子","西瓜","桃子","李子","梨子","木瓜"};
private String[] colorArr={"红色","黄色","紫红","黄色","金黄","暗绿","浅绿","浅紫色","浅绿色","浅蓝"};
// 仓库或者叫做缓冲区
private ArrayList<FruitInfo> proList=new ArrayList<FruitInfo>();
//定义一把锁,用来锁住对象
private Lock lock=new ReentrantLock();
//定义消费者监视器
private Condition customerCon=lock.newCondition();
//定义生产者监视器
private Condition producerCon=lock.newCondition();
/**
* 取数据的同步方法
* @param thName
* @return
*/
public void get(String thName) {
lock.lock();
while (proList.isEmpty()) {
try {
customerCon.await();//消费者等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int i=proList.size()-1;
FruitInfo fp=proList.get(i);
proList.remove(i);
producerCon.signal(); //唤醒生产者
System.out.println(thName + " 消费了仓库中的第" +(i+1)+"个水果=="+fp.getName()+","+fp.getColor()+
" >仓库剩余"+proList.size()+"个水果");
lock.unlock();
}
/**
* 存放数据的同步方法
* @param thName
*/
public synchronized void put(String thName) {
lock.lock();
while (proList.size()==SIZE) {
try {
producerCon.await();//生产者等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int i=new Random().nextInt(SIZE);
FruitInfo fp=new FruitInfo(nameArr[i], colorArr[i]);
proList.add(fp);
customerCon.signal(); // 唤醒消费者
System.out.println(thName + " 向仓库中放进去了一个水果=="+fp.getName()+","+fp.getColor()+
" >仓库剩余"+proList.size()+"个水果");
lock.unlock();
}
============
其它代码请参考我的博文【java生产者消费者模型(线程协作)】:
http://blog.csdn.net/wx5040257/article/details/77971915