AQS简单了解
JAVA并发包中,有很多锁方法,但是Lock是怎么实现?以ReentrantLock为例,来管中窥豹一下。
ReentrantLock reentrantLock=new ReentrantLock();
reentrantLock.lock();
reentrantLock.unlock();
// 看看 lock方法是怎么实现的?
public void lock() {
sync.acquire(1);
}
//查看 acquire 将会跳转到 AbstractQueuedSynchronizer (AQS)抽象类的
public final void acquire(int arg) {
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
selfInterrupt();
}
//跳转到tryAcquire 方法 ,可以在 AQS类找到该方法,但是 由于 ReentrantLock 内部来继承了 AQS, 且改写了该方法,故实际调用的应该是子类的方法。
final boolean nonfairTryAcquire(int acquires) {
final Thread current = Thread.currentThread();
//获取一个 state 状态
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;
}
//现在 我们假设 有两个 线程 (A、B)来竞争一个Lock,如果 A竞争成功,在上述改方法中 会返回 true