线程锁之ReentrantLock

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()  //返回标识此锁及其锁定状态的字符串

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值