lulinan

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

一个可重入的互斥锁定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 接口,此类还定义了isLockedgetLockQueueLength方法,以及一些相关的protected访问方法,这些方法对检测和监视可能很有用。

该类的序列化与内置锁定的行为方式相同:一个反序列化的锁定处于解除锁定状态,不管它被序列化时的状态是怎样的。

此锁定最多支持同一个线程发起的 2147483648 个递归锁定。

posted on 2013-08-03 16:52  lulinan  阅读(292)  评论(0)    收藏  举报