AQS源码分析
AQS(AbstractQueueedSynchronizer)使用一个int成员变量表示同步状态,通过内置的FIFO队列完成资源获取的排队工作
voaltile state 是为了保证state变量线程的可见性,
AQS改变state的方法主要有以下3个
getState()
setState()
compareAndSetState()
采用CAS添加节点到队列中好处
不必锁住整个链表就可以实现添加节点
lock()方法独占式
首先调用sync的acquire方法
public void lock() {
sync.acquire(1);
}
进入AQS,调用acqurie()方法
public final void acquire(int arg) {
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
selfInterrupt();
}
第一个分支执行tryAcquire(),
protected final boolean tryAcquire(int acquires) {
return nonfairTryAcquire(acquires);
}
点进去之后发现执行的nonfairTryAcquire()
/**
*尝试获取锁,成功返回true,失败返回false
**/
final boolean nonfairTryAcquire(int acquires) {
final Thread current = Thread.currentThread();
//获取当前的标志的状态
int c = getState();
//c==0表示没人获取这把锁
if (c == 0) {
//使用CAS操作尝试获取这把锁
if (compareAndSetState(0, acquires)) {
//如果获取成功,设置为独占线程
setExclusiveOwnerThread(current);
return true;
}
}
//如果该线程已经占有了该锁,将标志位加1,