8、JUC--Condition 控制线程通信
Condition
Condition 接口描述了可能会与锁有关联的条件变量。这些变量在用
法上与使用 Object.wait 访问的隐式监视器类似,但提供了更强大的
功能。需要特别指出的是,单个 Lock 可能与多个 Condition 对象关
联。为了避免兼容性问题,Condition 方法的名称与对应的 Object 版
本中的不同。
在 Condition 对象中,与 wait、notify 和 notifyAll 方法对应的分别是
await、signal 和 signalAll。
Condition 实例实质上被绑定到一个锁上。要为特定 Lock 实例获得
Condition 实例,请使用其 newCondition() 方法
使用Lock锁进行控制线程安全
继上一个工程的项目更改:
class Clerk1{ private int product =0; //Lock锁 private Lock lock = new ReentrantLock(); //获取Condition对象 private Condition condition = lock.newCondition(); //进货 public void get(){ //上锁 lock.lock(); try { while(product >=1){ System.out.println("产品已满!"); try { //this.wait(); condition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName()+":"+ ++product); //this.notifyAll(); condition.signalAll(); } finally { //解锁 lock.unlock(); } } //卖货 public void sale(){ //上锁 lock.lock(); try { while(product <=0){ System.out.println("产品卖完"); try { //this.wait(); condition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName()+":"+ --product); //this.notifyAll(); condition.signalAll(); } finally { lock.unlock(); } } }
此时运行之后的结果: