简介
Lock 接口的作用类似于 synchronized,但提供了更灵活的控制方式。使用 synchronized 时,等待和唤醒依赖于 Object 的 await() 和 notify() 方法;而使用 Lock 时,则通过 Condition 对象的 await() 和 signal() 方法实现。
Lock 与 synchronized 的主要区别在于,Lock 支持创建多个 Condition 实例,从而实现多路条件等待,而 synchronized 仅能配合单一的 monitor 对象。
示例
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 阻塞队列
* 采用多路 Condition
*/
public class BoundedBuffer {
/**锁*/
final Lock lock = new ReentrantLock();
/**未满条件*/
final Condition notFull = lock.newCondition();
/**非空条件*/
final Condition notEmpty = lock.newCondition();
/**阻塞队列数组对象*/
final Object[] items = new Object[100];
/**存放下标、取出下标和当前队列元素个数*/
int putIndex , takeIndex, count;
public void put(Object element) throws Exception {
lock.lock();
try {
while(count == items.length){ //队列已满
notFull.await(); //队列满等待
}
//存放数据
items[putIndex] = element;
if (++putIndex == items.length){
putIndex = 0;
}
count ++;
//唤醒空等待
notEmpty.signal();
} finally {
lock.unlock();
}
}
public Object take() throws Exception {
lock.lock();
Object value = null;
try {
while(count == 0) { //队列为空
notEmpty.await(); //队列空等待
}
//取出数据
value = items[takeIndex];
if (++takeIndex == items.length) {
takeIndex = 0;
}
count --;
//唤醒满等待
notFull.signal();
return value;
} finally {
lock.unlock();
}
}
}

