这是JDK1.5之后提供的多线程的升级解决方法。它的出现是为了替换synchronized关键字的同步操作。
java.util.concurrent.lock 中的 Lock 框架是锁定的一个抽象,它允许把锁定的实现作为 Java 类,而不是作为语言的特性来实现。ReentrantLock 类实现了 Lock ,它拥有与 synchronized 相同的并发性和内存语义,而且在多线程都想访问共享资源的处理山更优越一些。
1.Lock lock = new ReentrantLock();
因为ReentrantLock 类是Lock类的子类,通过多态,Lock lock = new ReentrantLock();父类变量指向一个子类对象。当然你也可以写成ReentrantLock lock = new ReentrantLock();我们需要的就是ReentrantLock的对象,因为ReentrantLock提供了Condition,对线程的等待和唤醒等操作更加灵活,一个ReentrantLock可以有多个Condition实例,所以更有扩展性。同时为下一个语句的出现做了准备。
需要注意的是lock 必须在 finally 块中释放。否则,如果受保护的代码将抛出异常,锁就有可能永远得不到释放!
2.Condition condition = lock.newCondition();
条件变量Condition,很大一个程度上是为了解决Object.wait/notify/notifyAll难以使用的问题而出现的。
而Lock中产生一个条件变量的方法是Lock.newCondition()。所以语句Condition condition = lock.newCondition();的作用就是通过ReentrantLock(继承了Lock)的对象将条件变量condition与锁绑定。从而用来调用wait/notify/notifyAll这些方法。 |