提到java的并发编程,我们就绕不过老生长谈的CAS和AQS,这一篇我们主要讲解AQS,AQS(AbstractQueueSynchronized),这个类中提供了一个FIFO队列,这个类是为很多其他的并发工具类提供了最基本的支持。通过维护一个volatile int state的常量的同步操作来判断是否获得锁。
这个类中主要提供了独占和共享两种锁,分别对应tryAcquire(int),tryRelease(int)和tryAcquireShare(int),tryReleaseShare(int)这两组方法,在AQS中,都只是抛出一个异常,需要子类去实现。
protected boolean tryAcquire(int arg) { throw new UnsupportedOperationException(); }protected boolean tryRelease(int arg) { throw new UnsupportedOperationException(); }protected int tryAcquireShared(int arg) { throw new UnsupportedOperationException(); }protected boolean tryReleaseShared(int arg) { throw new UnsupportedOperationException(); }
例如ReentrantLock中独占锁,就会实现tryAcquire和tryRelease方法。
而 Semaphore共享锁,就会实现tryAcquireShare和tryReleaseShare方法.
通常都是通过静态内部类的形式来继承AQS,从而达到安全保护的作用。