14.5 AbstractQueuedSynchronizer
同步类中管理状态的类,可以通过setState和getstate等方法来操作。
查看重入锁(ReentrantLock)的源代码,可以发现私有属性sync继承于AbstractQueuedSynchronizer,静态类NonfairSync和FairSync继承于AbstractQueuedSynchronizer。
concurrent类包中很多阻塞类都由此对象构建,例如:ReentrantLock、Semaphore、ReentranReadWriteLock、CountDownLanch、FutureTask。
我们也可以用AQS来实现自己的synchronizer。
原子变量与非阻塞同步机制
独占锁是一个悲观的技术。
原子变量类:
计量器:AtomicInteger、AtomicLong、AtomicBoolean、AtomicReference
数组:AtomickReferenceArray、
非阻塞算法:一个线程的失败或挂机不会影响其他线程的失败或挂起
CAS算法:比较并交换
模拟CAS算法代码:
package fifteen;
public class SimuCAS {
private int value;
public synchronized int get() {
return value;
}
public synchronized int compareAndSwap(int expectedValue, int newValue) {
int oldValue = value;
if (oldValue == expectedValue) {
value = newValue;
}
return oldValue;
}
public synchronized boolean compareAndSet(int expectedValue, int newValue) {
return (expectedValue == compareAndSwap(expectedValue, newValue));
}
}