最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2019年03月13日 15:51:12   作者:胖虎。。  
這篇文章主要tryAcquire()、addWaiter()、acquireQueued()的用法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

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

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)?,否則判斷當(dāng)前線程是否為exclusiveOwnerThread,然后把state++,也就是重入鎖的體現(xiàn),我們注意前半部分是通過CAS來保證同步,后半部分并沒有同步的體現(xiàn),原因是:后半部分是線程重入,再次獲得鎖時才觸發(fā)的操作,此時當(dāng)前線程擁有鎖,所以對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為當(dāng)前線程,Node.EXCLUSIVE 是獨占鎖, Node.SHARED 是共享鎖。
先找到等待隊列的tail節(jié)點pred,如果pred!=null,就把當(dāng)前線程添加到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í)行同上一步驟的添加隊尾操作,如果依然不存在,就把當(dāng)前線程作為head結(jié)點。
插入節(jié)點后,調(diào)用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);
    }
  }

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

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

相關(guān)文章

  • TransactionSynchronization的invokeAfterCompletion事務(wù)源碼解析

    TransactionSynchronization的invokeAfterCompletion事務(wù)源碼解析

    這篇文章主要為大家介紹了TransactionSynchronization的invokeAfterCompletion事務(wù)源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • Springboot實現(xiàn)人臉識別與WebSocket長連接的實現(xiàn)代碼

    Springboot實現(xiàn)人臉識別與WebSocket長連接的實現(xiàn)代碼

    這篇文章主要介紹了Springboot實現(xiàn)人臉識別與WebSocket長連接的實現(xiàn),本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-11-11
  • Java中synchronized的幾種使用方法

    Java中synchronized的幾種使用方法

    本文主要介紹了Java中synchronized的幾種使用方法,synchronized可用于修飾普通方法、靜態(tài)方法和代碼塊,下面詳細內(nèi)容介紹,需要的小伙伴可以參考一下
    2022-05-05
  • SpringBoot讀取Resource下文件的4種方法

    SpringBoot讀取Resource下文件的4種方法

    這篇文章主要介紹了SpringBoot讀取Resource下文件的4種方法小結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Springboot升級到2.7.2結(jié)合nacos遇到的坑及解決

    Springboot升級到2.7.2結(jié)合nacos遇到的坑及解決

    這篇文章主要介紹了Springboot升級到2.7.2結(jié)合nacos遇到的坑及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 在Mybatis @Select注解中實現(xiàn)拼寫動態(tài)sql

    在Mybatis @Select注解中實現(xiàn)拼寫動態(tài)sql

    這篇文章主要介紹了在Mybatis @Select注解中實現(xiàn)拼寫動態(tài)sql,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • hibernate框架環(huán)境搭建具體步驟(介紹)

    hibernate框架環(huán)境搭建具體步驟(介紹)

    下面小編就為大家?guī)硪黄猦ibernate框架環(huán)境搭建具體步驟(介紹)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • IDEA解決Java:程序包xxxx不存在的問題

    IDEA解決Java:程序包xxxx不存在的問題

    這篇文章主要介紹了IDEA解決Java:程序包xxxx不存在的問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Spring5中SpringWebContext方法過時的解決方案

    Spring5中SpringWebContext方法過時的解決方案

    這篇文章主要介紹了Spring5中SpringWebContext方法過時的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java漢字轉(zhuǎn)拼音案例詳解

    Java漢字轉(zhuǎn)拼音案例詳解

    這篇文章主要介紹了Java漢字轉(zhuǎn)拼音案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08

最新評論

城步| 富裕县| 肇州县| 茂名市| 河间市| 明水县| 池州市| 江西省| 武隆县| 大英县| 许昌县| 明溪县| 昌图县| 延庆县| 体育| 乐东| 阳城县| 油尖旺区| 青龙| 广平县| 水富县| 太康县| 平遥县| 六枝特区| 大理市| 孟州市| 漳浦县| 新建县| 兴海县| 衡东县| 阿坝| 鄢陵县| 车险| 汤阴县| 图木舒克市| 东辽县| 美姑县| 黑龙江省| 黔南| 兖州市| 甘德县|