相对于以前的版本,Java 5.0 引入了新的调节共享对象访问的机制,即重入
锁(ReentrantLock)。重入锁可以在内部锁被证明受到局限时,提供可选择的高
级特性。它具有与内在锁相同的内存语义、相同的锁定,但在争用条件下却有更
好的性能。
同时提供了读写锁,与互斥锁相比,读取数据远大于修改数据的频率时能提
升性能。
在第 3 章讲解 JDK 并发 API 时已经介绍过 ReentrantLock,本章做一些提升
和补充。
7.1. Lock 和 ReentrantLock
Lock 接口定义了一组抽象的锁定操作。与内部锁定(intrinsic locking)不同,
Lock 提供了无条件的、可轮询的、定时的、可中断的锁获取操作,所有加锁和
解锁的方法都是显式的。这提供了更加灵活的加锁机制,弥补了内部锁在功能上
的一些局限——不能中断那些正在等待获取锁的线程,并且在请求锁失败的情况
下,必须无限等待。
Lock 接口主要定义了下面的一些方法:
1)void lock():获取锁。如果锁不可用,出于线程调度目的,将禁用当前
线程,并且在获得锁之前,该线程将一直处于休眠状态。
2)void lockInterruptibly() throws InterruptedException:如果当前线程未被中
断,则获取锁。如果锁可用,则获取锁,并立即返回。如果当前线程在
获取锁时被 中断 ,并且支持对锁获取的中断,则将抛出
InterruptedException,并清除当前线程的已中断状态。
3)boolean tryLock():如果锁可用,则获取锁,并立即返回值 true。如果锁
不可用,则此方法将立即返回值 false。
4)boolean tryLock(long time, TimeUnit unit) throws InterruptedException:如
果锁在给定的等待时间内空闲,并且当前线程未被中断,则获取锁。
5)void unlock():释放锁。
6)Condition newCondition():返回绑定到此 Lock 实例的新 Condition 实
评论0
最新资源