Java中的ReentrantLock

ReentrantLock

ReentantLock 继承接口 Lock 并实现了接口中定义的方法,他是一种可重入锁,除了能完成

synchronized 所能完成的所有工作外,还提供了诸如可响应中断锁、可轮询锁请求、定时锁等避免多线

程死锁的方法。

Lock接口的主要方法

1. void lock(): 执行此方法时, 如果锁处于空闲状态, 当前线程将获取到锁. 相反, 如果锁已经被其他线程

持有, 将禁用当前线程, 直到当前线程获取到锁.

2. boolean tryLock():如果锁可用, 则获取锁, 并立即返回 true, 否则返回 false. 该方法和 lock()的区

别在于, tryLock()只是"试图"获取锁, 如果锁不可用, 不会导致当前线程被禁用, 当前线程仍然继续往

下执行代码.  lock()方法则是一定要获取到锁, 如果锁不可用, 就一直等待, 在未获得锁之前,当前线

程并不继续向下执行.3. void unlock():执行此方法时, 当前线程将释放持有的锁. 锁只能由持有者释放, 如果线程并不持有

, 却执行该方法, 可能导致异常的发生.

4. Condition newCondition():条件对象,获取等待通知组件。该组件和当前的锁绑定,

当前线程只有获取了锁,才能调用该组件的 await()方法,而调用后,当前线程将缩放锁。

5. getHoldCount() :查询当前线程保持此锁的次数,也就是执行此线程执行lock方法的次数。

6. getQueueLength():返回正等待获取此锁的线程估计数,比如启动 10 个线程,1 个线程获得

锁,此时返回的是 9

7. getWaitQueueLength:(Condition condition)返回等待与此锁相关的给定条件的线程估计数。

比如 10 个线程,用同一个 condition 对象,并且此时这 10 个线程都执行了 condition 对象的

await 方法,那么此时执行此方法返回 10

8. hasWaiters(Condition condition):查询是否有线程等待与此锁有关的给定条件

(condition),对于指定 contidion 对象,有多少线程执行了 condition.await 方法

9. hasQueuedThread(Thread thread):查询给定线程是否等待获取此锁

10. hasQueuedThreads():是否有线程等待此锁

11. isFair():该锁是否公平锁

12. isHeldByCurrentThread(): 当前线程是否保持锁锁定,线程的执行 lock 方法的前后分别是 false

 true

13. isLock():此锁是否有任意线程占用

14. lockInterruptibly():如果当前线程未被中断,获取锁

15. tryLock():尝试获得锁,仅在调用时锁未被线程占用,获得锁

16. tryLock(long timeout TimeUnit unit):如果锁在给定等待时间内没有被另一个线程保持,则获取

该锁。

非公平锁

JVM 按随机、就近原则分配锁的机制则称为不公平锁,ReentrantLock 在构造函数中提供了是否公平锁

的初始化方式,默认为非公平锁。非公平锁实际执行的效率要远远超出公平锁,除非程序有特殊需要,

否则最常用非公平锁的分配机制。

公平锁

公平锁指的是锁的分配机制是公平的,通常先对锁提出获取请求的线程会先被分配到锁,

ReentrantLock 在构造函数中提供了是否公平锁的初始化方式来定义公平锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栾还是恋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值