IT培訓-高端面授IT培訓機構
          云和教育:云和數據集團高端IT職業教育品牌
          • 國家級
            全民數字素養與技能培訓基地
          • 河南省
            第一批產教融合型企業建設培育單位
          • 鄭州市
            數字技能人才(碼農)培養評價聯盟

          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()方法返回當前計數器的值,即同步器的狀態。