ReentrantLock 重入的互斥锁定,它具有与使用synchronized 方法和语句所访问的隐式监视锁定相同的一些基本行为和语义,但功 能更强大。ReentrantLock 将由最近成功获得锁定,并且还没有释放该锁定的线程所拥有。当锁定没有被另一个线程所拥有时,调用 lock 的线程将成功获取该锁定并返回。如果当前线程已经拥有该锁定,此方法将立即返回。可以使用 isHeldByCurrentThread()
和 getHoldCount()
方法来检查此情况是否发生。
此类的构造方法接受一个可选的公平 参数。当设置为 true 时,在多个线程的争用下,这些锁定倾向于将访问权授予等待时间最长的线程。否则此锁定将无法保证任何特定访问顺序。与采用默认设置(使用不公平锁定)相比,使用公平锁定的程序在许多线程访问时表现为很低的总体吞吐量(即速度很慢,常常极其慢),但是在获得锁定和保证锁定分配的均衡性时差异较小。不过要注意的是,公平锁定不能保证线程调度的公平性。因此,使用公平锁定的众多线程中的一员可能获得多倍的成功机会,这种情况发生在其他活动线程没有被处理并且目前并未持有锁定时。还要注意的是,未定时的 tryLock
方法并没有使用公平设置。因为即使其他线程正在等待,只要该锁定是可用的,此方法就可以获得成功。‘
//构造方法
ReentrantLock() //创建一个RenntrantLock 的实例 默认 RenntrantLock(false)
ReentrantLock(boolean fair) //创建一个具有给定公平策略的RenntrantLock(true)
lock () 获取锁
lockInterruptibly() // 如果线程未被中端,则获取锁,如果该锁没有被另外一个线程保持,则获取该锁并立即返回,将锁的保持计数设置为1.
如果当前线程已经保持此锁,则将保持计数加 1,并且该方法立即返回。
如果锁被另一个线程保持,则出于线程调度目的,禁用当前线程,并且在发生以下两种情况之一以前,该线程将一直处于休眠状态:
- 锁由当前线程获得;或者
- 其他某个线程中断当前线程。
如果当前线程获得该锁,则将锁保持计数设置为 1。
如果当前线程:
- 在进入此方法时已经设置了该线程的中断状态;或者
- 在等待获取锁的同时被中断。
则抛出 InterruptedException
,并且清除当前线程的已中断状态。
在此实现中,因为此方法是一个显式中断点,所以要优先考虑响应中断,而不是响应锁的普通获取或重入获取。
tryLock() //仅在调用时锁定未被另外一个线程保持的情况下,才获取该锁
tryLock(long timeout,TimeUnit unit) 如果锁在给定等待时间内没有被另一个线程保持,且当前线程未被中断,则获取该锁。
unlock() //
试图释放此锁。
如果当前线程是此锁所有者,则将保持计数减 1。如果保持计数现在为 0,则释放该锁。如果当前线程不是此锁的持有者,则抛出 IllegalMonitorStateException
。
newCondition()返回用来与此 Lock
实例一起使用的 Condition
实例。
getHoldCount() //查询当前线程保持此锁的次数
isHeldByCurrentThread() //查询当前线程是否保持此锁
isLocked() // 查询此锁是否由任意保持。
isFair() //如果此锁的公平设置为true
getOwner() // 返回目前拥有的此锁的线程,如果不被任何线程拥有,则返回null
hasQueuedThreads() // 查询是否有些线程正在等待获取此锁
hasQueuedThread(Thread thread) //查询给定线程是否正在等待获取此锁
getQueueLength() // 返回正在等待获取此锁的线程估计数
getQueueThreads() //返回一个 collection,它包含可能正等待获取此锁的线程。
hasWaiters(Condition condition) //查询是否有些线程正在等待与此锁有关的给定条件。
getWaitQueLength(Condition conditon) //返回等待与此锁相关的给定条件的线程估计数。
getWaittingThreads(Condition conditon) //返回一个 collection,它包含可能正在等待与此锁相关给定条件的那些线程。
toString() //返回标识此锁及其锁定状态的字符串