一个可重入的互斥锁定Lock,它具有与使用synchronized方法和语句所访问的隐式监视器锁定相同的一些基本行为和语义,但功能更强大。
ReentrantLock将由最近成功获得锁定,并且还没有释放该锁定的线程所拥有。当锁定没有被另一个线程所拥有时,调用lock()的线程将成功获取该锁定并返回。如果当前线程已经拥有该锁定,此方法将立即返回。可以使用isHeldByCurrentThread()和getHoldCount()方法来检查此情况是否发生。
lock()方法如下执行:
如果该锁定没有被另一个线程保持,则获取该锁定并立即返回,将锁定的保持计数设置为1。
如果当前线程已经保持该锁定,则将保持计数加1,并且该方法立即返回。
如果该锁定被另一个线程保持,则出于线程调度的目的,禁用当前线程,并且在获得锁定之前,该线程将一直处于休眠状态,此时锁定保持计数被设置为1。
此类的构造方法接受一个可选的 公平 参数。当设置为true时,在多个线程的争用下,这些锁定倾向于将访问权授予等待时间最长的线程。否则此锁定将无法保证任何特定访问顺序。与采用默认设置(使用不公平锁定)相比,使用公平锁定的程序在许多线程访问时表现为很低的总体吞吐量(即速度很慢,常常极其慢),但是在获得锁定和保证锁定分配的均衡性时差异较小。不过要注意的是,公平锁定不能保证线程调度的公平性。因此,使用公平锁定的众多线程中的一员可能获得多倍的成功机会,这种情况发生在其他活动线程没有被处理并且目前并未持有锁定时。还要注意的是,未定时的tryLock方法并没有使用公平设置。因为即使其他线程正在等待,只要该锁定是可用的,此方法就可以获得成功。
最典型的代码如下:
1 class X { 2 private final ReentrantLock lock = new ReentrantLock(); 3 // ... 4 5 public void m() { 6 lock.lock(); // block until condition holds 7 try { 8 // ... method body 9 } finally { 10 lock.unlock() 11 } 12 } 13 }
除了实现 Lock 接口,此类还定义了isLocked和getLockQueueLength方法,以及一些相关的protected访问方法,这些方法对检测和监视可能很有用。
该类的序列化与内置锁定的行为方式相同:一个反序列化的锁定处于解除锁定状态,不管它被序列化时的状态是怎样的。
此锁定最多支持同一个线程发起的 2147483648 个递归锁定。

浙公网安备 33010602011771号