简介
Lock的作用就相当于synchronized,使用Lock就不需要使用synchronized,相反同理。
使用synchronized时等待和唤醒使用的是object.await()和object.notify();
使用Lock时使用等待和唤醒使用的是condition.await()和condition.signal();
Lock和synchronized的区别在于前者可以实现多路Condition,而后者不能有多个object,不能实现多路
使用synchronized时等待和唤醒使用的是object.await()和object.notify();
使用Lock时使用等待和唤醒使用的是condition.await()和condition.signal();
Lock和synchronized的区别在于前者可以实现多路Condition,而后者不能有多个object,不能实现多路
例子
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 阻塞队列
* 采用多路Condition
* @author liujun
*/
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();
}
}
}