-
(1) 在基于AQS构建的同步器类中, 最基本的操作是各种形式的__获取__操作和__释放__操作
(2) 获取操作是一种__依赖状态__的操作, 并且通常会阻塞
(3) 获取操作包括两个子操作:
1° 同步器判断当前状态是否允许获得操作
2° 更新同步器的状态
各种同步器(ReentrantLock, Semaphore等)的区别其实本质上就是这两个操作的实现方式不一样
(4) 释放操作不是一个可阻塞的操作
-
(1) 利用AQS实现一个简单的闭锁示例
@ThreadSafe public class OneShotLatch { private final Sync sync = new Sync(); // release operation public void signal() { sync.releaseShared(0); } // acquire operation public void await() throws InterruptedException { sync.acquireSharedInterruptibly(0); } private class Sync extends AbstractQueuedSynchronizer { protected int tryAcquireShared(int ignored) { // Succeed if latch is open (state == 1), else fail return (getState() == 1) ? 1 : -1; } protected boolean tryReleaseShared(int ignored) { setState(1); // Latch is now open return true; // Other threads may now be able to acquire } } }
这个示例中将实现委托给了内部的Sync类, 而Sync扩展了AQS的2个方法用于个性化定制
(2) 另一种实现方式是直接外部扩展AQS类, 但是这样不好因为现在OneShotLatch很简洁(只有2个方法), 扩展AQS类必然要引入一些其他方法
chapter14_构建自定义的同步工具_5_AbstractQueuedSynchronizer
最新推荐文章于 2021-06-20 10:24:03 发布