本文简单介绍Java并发包中最常用的ReentrantLock的用法。在Lock之前,程序员一般采用synchronized搭配wait、notify、notifyAll来完成线程互斥与同步。
ReentrantLock 和 Condition 配合的基本用法如下:
class LockSample{
private final Lock lock = new ReentrantLock();
private final Condition condition = lock.newCondition();
void testMethod(){
lock.lock();
try {
while (!check()){
condition.await();
}
doSomething();
condition.signalAll(); // signal()
} catch (InterruptedException e) {
handleException(e);
} finally {
lock.unlock();
}
}
// 省略了 check() 和 handleException(Excetption e) 的代码
}
而对应于Object方法的 wait、notify / notifyAll 方法的基本用法如下:
class LockSample{
void testMethod(){
synchronized(this) {
try {
while (!check()) {
wait();
}
doSomething();
notifyAll(); // notify()
} catch (InterruptedException e){
handleException(e);
}
}
}
// 省略了check 和 handleException 的代码
}
可以看出这两种锁模式的用法还是有非常共通之处的。
网友评论