回答

收藏

CAS唤醒后继线程 为什么是从后向前遍历

Java技术问答 Java技术问答 52 人阅读 | 0 人回复 | 2022-01-12

  1.     private void unparkSuccessor(Node node) {
  2.         /*
  3.          * If status is negative (i.e., possibly needing signal) try
  4.          * to clear in anticipation of signalling.  It is OK if this ! B  a; i- B0 [' K7 a
  5.          * fails or if status is changed by waiting thread. ( [: N8 D6 B4 ~1 l  N0 \! L
  6.          */ . K6 G9 ~+ F6 C8 ]3 P: l3 h
  7.         int ws = node.waitStatus; ) B0 X! \. W1 H) I
  8.         if (ws < 0)
  9.             compareAndSetWaitStatus(node, ws, 0);
  10. ' E: \5 S2 ]6 Z1 A. y0 a1 j# Z
  11.         /* . M# s. m# I" E5 h& Y+ {
  12.          * Thread to unpark is held in successor, which is normally
  13.          * just the next node.  But if cancelled or apparently null, ' }3 m6 L4 I) g/ b
  14.          * traverse backwards from tail to find the actual , ~+ i9 e& R. |# j
  15.          * non-cancelled successor.
  16.          */
  17.         Node s = node.next; ; h' x5 Y5 v. O$ h, b
  18.         if (s == null || s.waitStatus > 0) { # _3 [& I" p- M3 F& D4 `
  19.             s = null; - M$ ^5 G( U6 c* B* F
  20.             for (Node t = tail; t != null && t != node; t = t.prev)
  21.                 if (t.waitStatus <= 0) + o9 l3 ]5 s6 |+ s
  22.                     s = t;
  23.         }
  24.         if (s != null)
  25.             LockSupport.unpark(s.thread); 4 E, a/ Q  i9 U/ J/ @7 w( a; y
  26.     }
复制代码
如果没有合法的数据,从后向前遍历,为什么这么做呢?从前向后不行吗?
6 c* w. f" Y& \! _# q
我知道答案 回答被采纳将会获得5 金钱 已有0人回答
分享到:
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则