欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

本文實例為大家分享了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()的用法詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

相關文章

  • Java中的服務發(fā)現與負載均衡及Eureka與Ribbon的應用小結

    Java中的服務發(fā)現與負載均衡及Eureka與Ribbon的應用小結

    這篇文章主要介紹了Java中的服務發(fā)現與負載均衡:Eureka與Ribbon的應用,通過使用Eureka和Ribbon,我們可以在Java項目中實現高效的服務發(fā)現和負載均衡,需要的朋友可以參考下
    2024-08-08
  • Maven中央倉庫地址配置大全

    Maven中央倉庫地址配置大全

    這篇文章主要介紹了Maven中央倉庫地址配置大全,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • Java中超詳細this與super的概念和用法

    Java中超詳細this與super的概念和用法

    這篇文章主要介紹了Java中超詳細this與super的概念和用法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • java判斷class子類或父類的實例方法

    java判斷class子類或父類的實例方法

    在本篇文章里小編給大家整理的是關于java判斷class子類或父類的實例方法,需要的朋友們可以參考學習下。
    2020-02-02
  • Java?集合框架?Queue?和?Stack?體系

    Java?集合框架?Queue?和?Stack?體系

    這篇文章主要介紹了Java?集合框架Queue和Stack體系,Stack?繼承自Vector,并拓展了五個允許將容器視為棧結構的操作,Queue接口定義了隊列的能力,它繼承自Collection,更多相關內容需要得小伙伴可以參考一下
    2022-06-06
  • Java SPI 機制知識點總結

    Java SPI 機制知識點總結

    在本篇文章里小編給大家整理的是一篇關于Java SPI 機制知識點總結內容,需要的朋友們可以參考下。
    2020-02-02
  • Java排序算法之SleepSort排序示例

    Java排序算法之SleepSort排序示例

    這篇文章主要介紹了Java排序算法之SleepSort排序,結合實例形式分析了SleepSort排序的實現步驟與相關操作技巧,需要的朋友可以參考下
    2017-01-01
  • Servlet的5種方式實現表單提交(注冊小功能),后臺獲取表單數據實例

    Servlet的5種方式實現表單提交(注冊小功能),后臺獲取表單數據實例

    這篇文章主要介紹了Servlet的5種方式實現表單提交(注冊小功能),后臺獲取表單數據實例,非常具有實用價值,需要的朋友可以參考下
    2017-05-05
  • Java實現兩人五子棋游戲(四) 落子動作的實現

    Java實現兩人五子棋游戲(四) 落子動作的實現

    這篇文章主要為大家詳細介紹了Java實現兩人五子棋游戲,落子動作的實現代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • redis incr和incrBy的使用說明

    redis incr和incrBy的使用說明

    這篇文章主要介紹了redis incr和incrBy的使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11

最新評論