ReentrantLock源码解析

可重入锁

表示支持一个线程对某个资源进行重复加锁

ReentrantLock也是通过实现Lock接口并在内部聚合一个同步器来实现的,且支持公平和非公平性获取锁。所谓公平性获取锁指在同步队列中靠前的等待线程会先获得锁。

public class ReentrantLock implements Lock, java.io.Serializable {
    private static final long serialVersionUID = 7373984872572414699L;
    
    private final Sync sync;
    
    abstract static class Sync extends AbstractQueuedSynchronizer {
        final boolean nonfairTryAcquire(int acquires) {...}
        protected final boolean tryRelease(int releases) {...} 
        ...
    }
    
    static final class NonfairSync extends Sync {...}
    static final class FairSync extends Sync {...}
}
​

非公平性获取锁

每个线程都会以CAS方式更改state值以获取锁,且函数会接受一个int值表示获取锁的数量。

可以看出,如果state为0,表示没有线程持有锁,直接进行获取锁操作,若state不为0,则检查持有锁的线程是否为本线程,若是,则可以重复加锁,这就实现了可重入的功能。

final boolean nonfairTryAcquire(int acquires) {
    final Thread current = Thread.curren
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值