ReentrantLock实现原理及源码分析

本文深入探讨了ReentrantLock的实现原理,强调了其可重入性,并与synchronized进行了对比。通过分析ReentrantLock的无参构造器和带布尔值的构造器,展示了如何选择公平锁或非公平锁。同时,概述了lock(), lockInterruptibly(), tryLock() 和 unlock() 方法的工作机制。ReentrantLock基于AbstractQueuedSynchronizer(AQS),并通过内部类NonfairSync和FairSync实现公平性和非公平性。文章还提供了关于如何进一步学习ReentrantLock的指引。" 81947062,7873968,generic netlink编程:从入门到实践,"['Linux内核', '网络编程', 'kernel开发', '用户空间接口', '通信协议']
摘要由CSDN通过智能技术生成

所谓的可重入性,就是可以支持一个线程对锁的重复获取,原生的synchronized就具有可重入性,一个用synchronized修饰的递归方法,当线程在执行期间,它是可以反复获取到锁的,而不会出现自己把自己锁死的情况。ReentrantLock也是如此,在调用lock()方法时,已经获取到锁的线程,能够再次调用lock()方法获取锁而不被阻塞。那么有可重入锁,就有不可重入锁,我们在之前文章中自定义的一个Mutex锁就是个不可重入锁,不过使用场景极少而已。

公平锁/非公平锁

所谓公平锁,顾名思义,意指锁的获取策略相对公平,当多个线程在获取同一个锁时,必须按照锁的申请时间来依次获得锁,排排队,不能插队;非公平锁则不同,当锁被释放时,等待中的线程均有机会获得锁。synchronized是非公平锁,ReentrantLock默认也是非公平的,但是可以通过带boolean参数的构造方法指定使用公平锁,但非公平锁的性能一般要优于公平锁。

synchronized是Java原生的互斥同步锁,使用方便,对于synchronized修饰的方法或同步块,无需再显式释放锁。synchronized底层是通过monitorenter和monitorexit两个字节码指令来实现加锁解锁操作的。而ReentrantLock做为API层面的互斥锁,需要显式地去加锁解锁。

class X {

private final ReentrantLock lock = new ReentrantLock();

// …

public void m() {

lock

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值