- 可重入锁ReentrantLock是怎么实现可重入的
ReentrantLock实现可重入性的机制主要依赖于以下几个核心组件和步骤:
状态计数器:ReentrantLock内部维护一个名为state的整型变量作为状态计数器,这个计数器不仅用来记录锁是否被持有,还记录了锁被重入的次数。当线程首次获取锁时,state值加1;每次线程重新进入同步块,state值继续递增。
线程局部变量:为了跟踪哪个线程持有锁,ReentrantLock使用了线程局部变量(ThreadLocal)来存储持有锁的线程标识和重入次数。这样,每当线程尝试获取锁时,可以快速判断当前锁是否由自己持有。
CAS操作:在尝试获取锁时,ReentrantLock使用了Compare-And-Swap(CAS)原子操作来修改state计数器,这是一种非阻塞同步技术,能够保证操作的原子性和一致性。如果当前锁未被持有(state为0),或者锁由当前线程持有(state大于0),CAS操作会尝试增加state的值,从而成功获取或重入锁。
锁的释放:当线程退出同步代码块并调用unlock()方法时,state计数器会递减。如果递减后state变为0,表示锁已经被完全释放,此时会唤醒在锁的等待队列中的其他线程。
总结来说,ReentrantLock通过维护一个状态计数器来记录锁的持有状态和重入次数,结合线程局部变量来识别锁的持有者,并利用CAS操作实现非阻塞的锁获取和释放,从而高效地支持了可重入特性。这种设计允许同一个线程在没有释放锁的情况下反复进入同步代码块,而不会产生死锁,同时也保持了锁操作的高性能。
如果大家需要视频版本的讲解,欢迎关注我的B站: