接上次的 生产者,消费者案例。
这次的目的是为了解决多线程多任务效率问题。
使用了JDK1.5 java.util.concurrent.locks包中的对象。
Lock接口,它的出现比synchronized有更多的操作。
lock(); 获取锁 unlock();释放锁
同步代码块或者同步函数的锁操作是隐式的。
JDK1.5,Lock接口按照面向对象的思想,将锁单独封装成一个对象。
Lock类型的对象(接口实现类,创建对象后为Lock类型的对象)。
以前的锁对象是任意的,现在固定了,面对Lock类型的对象。并提供了显示的锁操作。
Lock接口就是同步的代替。
1、将线程中的同步更换为Lock接口的形式。
(记得要导入包 import java.util.concurrent.locks.*)
Lock lock = new Reentrantlock();
(并不是想使用实现类特有的方法,多态提升为Lock类型)
替换后失败了。因为wait()没有了同步区域,没有了所属的同步锁。
同步升级了,其中锁已经不是任意对象了,而是Lock类型的对象。那么和任意对象绑定的监视器方法是不是也升级了,有了专门和Lock类型锁绑定的监视器方法呢???
查阅API,Condition接口替代了Object中的监视器方法。
以前的监视器方法封装到每一个对象当中。
现在的监视器方法单独封装到了Condition类型对象中。
方法为: await(); signal(); signalAll();
JDK1.4 synchronized(obj){ JDK1.5 Lock lock = new Reentrantlock();
obj.wait(); void show(){
obj.notify(); lock.lock();
} lock.unlock();
}
obj作为锁,内部本身就有了监视器的方法。(直接封装到锁里面) Contiditon
lock.new Condition();