abstract static class Sync extends AbstractQueuedSynchronizer { private static final long serialVersionUID = 1192457210091910933L;
// 初始化访问 Sync(int permits) { setState(permits); }
final int getPermits() { return getState(); }
// 非公平方式获取AQS共享式资源 final int nonfairTryAcquireShared(int acquires) { // 自旋 for (;;) { // 获取state值 int available = getState(); // 计算获取资源后值应该是多少 int remaining = available - acquires; // 如果大于等于0说明满足条件,将计算后值通过CAS修改后返回,如果小于0直接返回 if (remaining < 0 || compareAndSetState(available, remaining)) return remaining; } }
// 释放锁,就是把state加回来 protected final boolean tryReleaseShared(int releases) { for (;;) { // 获取state值 int current = getState(); // 计算加后的值 int next = current + releases; // 如果加后值小于当前state值,说明参数为负数,抛异常 if (next < current) // overflow throw new Error("Maximum permit count exceeded"); // 使用CAS方式修改值 if (compareAndSetState(current, next)) return true; } }
// state减操作 final void reducePermits(int reductions) { // 自旋 for (;;) { // 获取state值 int current = getState(); // 计算减后的值 int next = current - reductions; // 如果减后值大于当前state值,说明参数为负数,抛异常 if (next > current) // underflow throw new Error("Permit count underflow"); // 使用CAS方式修改值 if (compareAndSetState(current, next)) return; } }
// 公平 static final class FairSync extends Sync { private static final long serialVersionUID = 2014338818796000944L;
FairSync(int permits) { super(permits); }
// 无限自旋直到CAS修改成功 protected int tryAcquireShared(int acquires) { for (;;) {
// 比非公平锁多了一个步骤,判断前面是否有人,如果前面有人就放弃 if (hasQueuedPredecessors()) return -1; int available = getState(); int remaining = available - acquires; if (remaining < 0 || compareAndSetState(available, remaining)) return remaining; } } }