1. 线程通信
上节讲的虚假唤醒,使用的是内置锁synchronized,那么我们使用同步锁(显示锁)Lock其实也一样达到效果。
我们知道,内置锁通过wait()notify()notifyAll()进行线程间通信。同步锁也一样是否一样可以进行通信呢?
1.1 显示锁Condition线程通信
Contion接口描述了可能会与锁有关联的条件变量。单个Lock可能与多个Condition对象关联,在Contiion中与
wait、notify、notifyAll相对的方法是await、signal、signalAll。Lock实例newContiion方法获取Contiion。
那么上节中的案例就改成了如下:
class Clerk {
private int product = 0 ;
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
//进货
public void get() {
lock.lock();
try {
//修改库存为1
while (product >= 1) {
System.out.println("产品已满!");
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//去掉else
System.out.println(Thread.currentThread().getName() + " : " + ++product);
condition.signalAll();
} finally {
lock.unlock();
}
}
//卖货
public void sale() {
lock.lock();
try {
while (product <= 0) {
System.out.println("没货了!");
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//去掉else
System.out.println(Thread.currentThread().getName() + " : " + --product);
condition.signalAll();
} finally {
lock.lock();
}
}
}