chapter14_构建自定义的同步工具_5_AbstractQueuedSynchronizer

  • (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类必然要引入一些其他方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值