IT培训-高端面授IT培训机构
云和教育:云和数据集团高端IT职业教育品牌 全国咨询热线:0371-67988003
课程 请选择课程
    校区 请选择校区
      • 华为
        授权培训中心
      • 腾讯云
        一级认证培训中心
      • 百度营销大学
        豫陕深授权运营中心
      • Oracle甲骨文
        OAEP中心
      • Microsoft Azure
        微软云合作伙伴
      • Unity公司
        战略合作伙伴
      • 普华基础软件
        战略合作伙伴
      • 新开普(股票代码300248)
        旗下丹诚开普投资
      • 中国互联网百强企业锐之旗
        旗下锐旗资本投资

      AQS框架了解过吗?具体是干嘛的?

      • 发布时间:
        2023-04-12
      • 版权所有:
        云和教育
      • 分享:

      AQS(AbstractQueuedSynchronizer)是Java中用于构建同步器的框架,它提供了一种实现各种同步器的通用框架,例如ReentrantLock、Semaphore、CountDownLatch等等。

      AQS框架的核心思想是使用一个双向链表来维护等待线程队列,同时使用一个状态变量来表示当前同步器的状态。当线程请求获取同步器的锁时,如果同步器已经被占用,那么线程就会被加入等待队列中,并阻塞自己,等待被唤醒;如果同步器未被占用,则线程直接获取同步器的锁,并将同步器的状态设置为“已占用”。

       

      下面是一个简单的示例,演示了如何使用 AQS 框架来实现一个简单的计数器:

      import java.util.concurrent.locks.AbstractQueuedSynchronizer;
      
      public class Counter {
          private final Sync sync = new Sync();
      
          public void increment() {
              sync.acquire(1);
              try {
                  // 进行计数器加一操作
              } finally {
                  sync.release(1);
              }
          }
      
          public int getCount() {
              return sync.getCount();
          }
      
          private static class Sync extends AbstractQueuedSynchronizer {
              private static final long serialVersionUID = 1L;
      
              protected boolean tryAcquire(int arg) {
                  return compareAndSetState(0, arg);
              }
      
              protected boolean tryRelease(int arg) {
                  int c = getState() - arg;
                  if (c == 0) {
                      return true;
                  }
                  if (c < 0) {
                      throw new IllegalStateException("Counter underflow");
                  }
                  setState(c);
                  return false;
              }
      
              public int getCount() {
                  return getState();
              }
          }
      }

      在上面的示例中,Counter类包含一个Sync类的实例,它继承了AbstractQueuedSynchronizer并实现了 tryAcquire()、tryRelease()方法。increment()方法首先尝试获取同步器的锁(即调用 acquire() 方法),然后进行计数器加一操作,最后释放同步器的锁(即调用release() 方法)。getCount()方法返回当前计数器的值,即同步器的状态。