Java并发编程——ReentrantLock

简介

ReentantLock 继承接口 Lock 并实现了接口中定义的方法,他是一种可重入锁,除了能完 成 synchronized 所能完成的所有工作外,还提供了诸如可响应中断锁、可轮询锁请求、定时锁等 避免多线程死锁的方法。

Lock接口

  1. void lock()
    执行此方法时, 如果锁处于空闲状态, 当前线程将获取到锁. 相反, 如果锁已经 被其他线程持有, 将禁用当前线程, 直到当前线程获取到锁.
  2. void unlock()
    执行此方法时, 当前线程将释放持有的锁. 锁只能由持有者释放, 如果线程 并不持有锁, 却执行该方法, 可能导致异常的发生.
  3. Condition newCondition()
    条件对象,获取等待通知组件。该组件和当前的锁绑定, 当前线程只有获取了锁,才能调用该组件的 await()方法,而调用后,当前线程将缩放锁。
  4. getHoldCount()
    查询当前线程保持此锁的次数,也就是执行此线程执行lock方法的次 数。
  5. getQueueLength()
    返回正等待获取此锁的线程估计数,比如启动 10 个线程,1 个 线程获得锁,此时返回的是9
  6. getWaitQueueLength(Condition condition)
    返回等待与此锁相关的给定条件的线 程估计数。比如 10 个线程,用同一个 condition 对象,并且此时这 10 个线程都执行了 condition对象的 await方法,那么此时执行此方法返回10
  7. hasWaiters(Condition condition)
    查询是否有线程等待与此锁有关的给定条件 (condition),对于指定contidion对象,有多少线程执行了condition.await方法
  8. hasQueuedThread(Thread thread)
    查询给定线程是否等待获取此锁
  9. hasQueuedThreads()
    是否有线程等待此锁
  10. isFair()
    该锁是否公平锁
  11. isHeldByCurrentThread()
    当前线程是否保持锁锁定,线程的执行 lock 方法的前后分 别是false和true
  12. isLock()
    此锁是否有任意线程占用
  13. lockInterruptibly()
    如果当前线程未被中断,获取锁
  14. boolean tryLock()
    如果锁可用, 则获取锁, 并立即返回 true, 否则返回 false. 该方法和 lock()的区别在于, tryLock()只是"试图"获取锁, 如果锁不可用, 不会导致当前线程被禁用, 当前线程仍然继续往下执行代码. 而 lock()方法则是一定要获取到锁, 如果锁不可用, 就一 直等待, 在未获得锁之前,当前线程并不继续向下执行.
  15. tryLock(long timeout TimeUnit unit)
    如果锁在给定等待时间内没有被另一个线程保持, 则获取该锁。

ReentrantLock与Synchronized

这篇文章家的比较清楚:synchronized和ReentrantLock区别

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值