一:可重入锁ReentrantLock
ReentrantLock基于AQS,在并发编程中它可以实现公平锁和非公平锁来对共享资源进行同步。同时,和synchronized—样,ReentrantLock支持可重入。除此之外,ReentrantLock在调度上更灵活,支持更多丰富的功能。
1、Lock接口
介绍 ReentrantLock 之前我们可以先看一下 Lock接口,因为 ReentrantLock 实现了 Lock 接口。
在Java SE 5 之后,并发包中新增了Lock接口用来实现锁功能,它提供了与synchronized关键字类似的同步功能,只是在使用时需要显示地获取和释放锁。
Lock的意义在于提供了区别于synchronized的另一种具有更多广泛操作的同步方式,它能支持更多灵活的结构,并且可以关联多个Condition对象。
在 Lock 接口中一共只提供了6个方法:
2、Condition接口
3、ReentrantLock
首先看一下 ReentrantLock 的整体结构。 ReentrantLock 只有一个属性 Sync ,且被 final 修饰,即一旦初始化后就不能再修改了。
此外 ReentrantLock 里面最核心的是三个内部类: Sync、NonfairSync、FairSync、以及对于Lock接口的实现
4、内部类Sync
Sync 本身继承AQS且被 abstract 修饰的,说明他需要通过子类来实例化。FairSync、NonfairSync 是它两个唯二的子类。
lock()方法是一个空实现,等着子类来实现。 那么这也就说明: 公平模式(FairSync)和非公平模式(NonfairSync)对于获取锁的实现一定是不一样的。
其它的方法都是被 final 修饰的,所以这些方法应该是对AQS内部方法的封装并且本身的实现已经比较完善了,不希望被外部破坏,希望外部直接的去调用。
(1)nonfairTryAcquire() 非公平的尝试获取锁
(2)tryRelease() 注意:这个方法的返回值代表的是是否完全被释放,而不是,是否成功释放
下面先介绍一下公平锁和非公平锁
公平锁:按照请求锁的顺序分配,拥有稳定获得锁的机会,但是性能可能比非公平锁低。
非公平锁:不按照请求锁的顺序分配,不一定拥有获得锁的机会,但是性能可能比公平锁高。
5、NonfairSync
6、FairSync
|