多线程——生产者和消费者的改进-Lock接口
在上一个代码中,存在一个bug, 就是notifyAll(), 可能会将本方的线程也给唤醒, 如何才能让他不换醒呢?
接口中Lock,特点是替代了synchronized,比使用synchronized方法和语句可获得更广泛的锁定操作。
首先:synchronized,开锁解锁都是隐式的, 而lock就可以一目了然的看到,他是显示的,
并且可以支持多个相关的Condition对象。
而Condition把wait,notify,notifyAll,替代,因此可以将代码改进:
注明:
private Lock lock=new ReentrantLock();//多态, 创建一个锁对象
private Condition condition_pro=lock.newCondition();//创建condition的对象
private Condition condition_con=lock.newCondition();
并且可以指定某个锁的condition的对象。
优点:
JDK1.5后提供了显式的锁机制和显式的等待唤醒操作机制,同时把等待唤醒机制封装了对象,,一个锁可以对应多个condition, 而以前只能有一个wait , condition , 本例中,实现了本方只唤醒对方的操作。
|