麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發(fā) > Java > 正文

詳解tryAcquire()、addWaiter()、acquireQueued()

2024-07-14 08:43:38
字體:
來源:轉載
供稿:網友

本文實例為大家分享了tryAcquire()、addWaiter()、acquireQueued()的用法 ,供大家參考,具體內容如下

tryAcquire()

final boolean nonfairTryAcquire(int acquires) {      final Thread current = Thread.currentThread();      int c = getState();      if (c == 0) {        if (compareAndSetState(0, acquires)) {          setExclusiveOwnerThread(current);          return true;        }      }      else if (current == getExclusiveOwnerThread()) {        int nextc = c + acquires;        if (nextc < 0) // overflow          throw new Error("Maximum lock count exceeded");        setState(nextc);        return true;      }      return false;    }

先判斷state是否為0,如果為0就執(zhí)行上面提到的lock方法的前半部分,通過CAS操作將state的值從0變?yōu)?,否則判斷當前線程是否為exclusiveOwnerThread,然后把state++,也就是重入鎖的體現,我們注意前半部分是通過CAS來保證同步,后半部分并沒有同步的體現,原因是:后半部分是線程重入,再次獲得鎖時才觸發(fā)的操作,此時當前線程擁有鎖,所以對ReentrantLock的屬性操作是無需加鎖的。如果tryAcquire()獲取失敗,則要執(zhí)行addWaiter()向等待隊列中添加一個獨占模式的節(jié)點。

addWaiter()

/**   * Creates and enqueues node for current thread and given mode.   *   * @param mode Node.EXCLUSIVE for exclusive, Node.SHARED for shared   * @return the new node   */  private Node addWaiter(Node mode) {    Node node = new Node(Thread.currentThread(), mode);    // Try the fast path of enq; backup to full enq on failure    Node pred = tail;    if (pred != null) {      node.prev = pred;      if (compareAndSetTail(pred, node)) {        pred.next = node;        return node;      }    }    enq(node);    return node;  }

這個方法的注釋:創(chuàng)建一個入隊node為當前線程,Node.EXCLUSIVE 是獨占鎖, Node.SHARED 是共享鎖。
先找到等待隊列的tail節(jié)點pred,如果pred!=null,就把當前線程添加到pred后面進入等待隊列,如果不存在tail節(jié)點執(zhí)行enq()

private Node enq(final Node node) {    for (;;) {      Node t = tail;      if (t == null) { // Must initialize        if (compareAndSetHead(new Node()))          tail = head;      } else {        node.prev = t;        if (compareAndSetTail(t, node)) {          t.next = node;          return t;        }      }    }  }

這里進行了循環(huán),如果此時存在了tail就執(zhí)行同上一步驟的添加隊尾操作,如果依然不存在,就把當前線程作為head結點。
插入節(jié)點后,調用acquireQueued()進行阻塞

acquireQueued()

final boolean acquireQueued(final Node node, int arg) {    boolean failed = true;    try {      boolean interrupted = false;      for (;;) {        final Node p = node.predecessor();        if (p == head && tryAcquire(arg)) {          setHead(node);          p.next = null; // help GC          failed = false;          return interrupted;        }        if (shouldParkAfterFailedAcquire(p, node) &&          parkAndCheckInterrupt())          interrupted = true;      }    } finally {      if (failed)        cancelAcquire(node);    }  }

先獲取當前節(jié)點的前一節(jié)點p,如果p是head的話就再進行一次tryAcquire(arg)操作,如果成功就返回,否則就執(zhí)行shouldParkAfterFailedAcquire、parkAndCheckInterrupt來達到阻塞效果;

以上所述是小編給大家介紹的tryAcquire()、addWaiter()、acquireQueued()的用法詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 伊人yinren22综合网色 | 国产成人在线观看网站 | 中文字幕xxx | 免费视频观看 | 久久国产精品二国产精品中国洋人 | 国产一区二区在线观看视频 | 免费看日韩片 | 九九视屏 | 91精品国产99久久久久久 | 国产亚洲自拍一区 | 欧美一区二区三区免费观看 | 九九热精 | 精品一区二区久久久久久久网精 | 黄色片网站免费在线观看 | www.99久久久 | 正在播放91 | 成码无人av片在线观看网站 | 手机在线看片国产 | 中国的免费的视频 | 黄色美女免费 | 国产91大片 | hdhdhd69ⅹxxx黑人 | 成人午夜网址 | 欧美性猛交xxx乱大交3蜜桃 | a一级黄| 免费a级毛片大学生免费观看 | 在线播放污| 97伦理 | 欧美国产精品一区二区 | 欧美人与牲禽动交精品一区 | 成人国产精品一区二区毛片在线 | 精品国产一区二区三区久久久蜜月 | 黄色特级片黄色特级片 | 欧美视频在线一区二区三区 | 色妞妞视频| 一级免费黄视频 | 国产亚洲精品久久午夜玫瑰园 | 性爱网站 | 久久精品小短片 | 国产精品入口夜色视频大尺度 | 亚洲四播房 |