引言
ReentrantLock是JDK提供的一个可重入互斥锁,所谓可重入就是同一个锁答允被已经得到该锁的线程从头得到。可重入锁的长处可以在递归算法中利用锁,不行重入锁则导致无法在递归算法中利用锁。因为第二次递归时由于第一次递归已经占有锁,而导致死锁。本文我们将探讨JDK中ReentrantLock的实现。
Semaphore是JDK提供的一个可共享的同步组建,有n个许可,多个线程可以配合去得到许可,当线程申请的许可小于n时即可乐成申请,不然申请失败。
AQS(AbstractQueuedSynchronizer)是Java实现同步组建的基本框架,一般以静态内部类的形式实此刻某个同步组件类中,通过署理的方法向外提供同步处事,ReentrantLock和Semaphore都是基于AQS实现的同步组件,前者是独有式同步组建,即一个线程得到后,其他线程无法得到。后者是共享式同步组件,一个线程得到后,在满意的条件下,其他线程也可以得到。
AQS事情道理
AQS是Java实现同步组建的基本框架,其根基思想是用一个volatile int state变量来暗示当前同步组件的状态,用getState()获取同步组件的状态,用compareAndSet(int expect, int update)来对state状态举办操纵,compareAndSet可以担保对state变量更新值的原子性。AQS中许多要领是final的,即不答允用户包围,软件开发,用户自界说的要领一般有:
AQS提供的模板要领有:
ReentrantLock源码阐明
ReentrantLock的默认结构函数是
public ReentrantLock() { sync = new NonfairSync(); }
NonfairSync担任了Sync,Sync是一个抽象类,并担任了抽象类AbstractQueuedSynchronizer。
ReentrantLock是一个独有式的锁,所以它需要实现tryAcquire函数和tryRelease函数
tryAcquire函数源码如下
protected final boolean tryAcquire(int acquires) { return nonfairTryAcquire(acquires); }
nonfairTryAcquire(acquires)源码如下
final boolean nonfairTryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) { if (compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } else if (current == getExclusiveOwnerThread()) { int nextc = c + acquires; if (nextc < 0) // overflow throw new Error("Maximum lock count exceeded"); setState(nextc); return true; } return false; }