Java基础——多线程(4)

接上次的  生产者,消费者案例。

这次的目的是为了解决多线程多任务效率问题

使用了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();

原文地址:https://www.cnblogs.com/lenjava/p/3788734.html