认识ReentranLock
先一句话对ReentranLock进行概括:ReentranLock基于AQS,它实现了公平锁和非公平锁,开发中可以使用它对共享资源进行同步,和synchronized一样,ReentranLock支持可重入,但ReentranLock在调度上更灵活,功能更丰富,当也要求调用者对并发的经验比较多
ReentrantLock源码分析
ReentranLock继承了Lock锁,Lock锁的意义就是区别于synchronized的另一种提供了更多广泛操作的同步方式,他能支持更灵活的结构,并且可以关联多个Condition对象
Condition对象是一个条件对象,不同的线程可以通过该条件来进行通信,一个Lock对象可以关联多个Condition对象,多个线程可以被绑定到不同的Condition对象中,可以实现分组等待唤醒
看一下ReentranLock中的几个主要方法:
在进入到lock方法后,发现内部调用了sync.lock()方法,去找方法的实现时,发现了两个实现
- FairSync:公平锁 每个线程都会在执行lock方法时,会先查看是否有线程排队,如果有,直接去排队。如果没有才会去尝争一下锁资源。
- NonfairSync: 非公平锁 每个线程都会在执行lock方法时,先尝试获取锁资源,获取不到再排队。
非公平lock方法源码
来看非公平锁的实现:
它继承了Sync锁,这个Sync则是实现了AQS
这里的lock方法是对锁的一次获取,如果CAS成功,那么当前线程获得锁,否则调用acquire方法
其中它的可重入就体现在acquire方法中判断当前线程是否和加锁的线程是同一个,如果是则state+1
acquire方法就是在AQS中创建一个保存这个线程的Node节点,然后放到FIFO队列中阻塞等待唤醒去尝试CAS
具体见我的AQS源码分析