相关状态
//标志节点已被取消
static final int CANCELLED = 1;
//标志后继节点处于等待状态
static final int SIGNAL = -1;
acquire(int arg)
获取独占资源
public final void acquire(int arg) {
//1、尝试获取独占资源 成功返回 失败进行下一步
// 2、生成节点,将其添加进同步队列 竞争成功返回
//3、若线程在不可中断的时候被中断了
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
//4、处理中断
selfInterrupt();
}
tryAcquire(arg)
在AbstractQueuedSynchronizer的子类中自行重写的获取资源的方法
例:
@Override
public boolean tryAcquire(int acquires){
if (compareAndSetState(0,1)){
setExclusiveOwnerThread(Thread.currentThread());
return true;
}
return false;
}
compareAndSetState(int expect, int update)
protected final boolean compareAndSetState(int expect, int update) {
//compareAndSwapInt是Java的native方法,并不由Java语言实现。
//方法的作用是,读取传入对象o(this)在内存中偏移量为offset位置的值与期望值expected作比较。
//相等就把update值赋值给offset位置的值。方法返回true。不相等,就取消赋值,方法返回false。
return unsafe.compareAndSwapInt(this, stateOffset, ex