1回答

0收藏

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

Java技术问答 Java技术问答 40 人阅读 | 1 人回复 | 2022-01-14

  1.     private void unparkSuccessor(Node node) {
  2.         /*
  3.          * If status is negative (i.e., possibly needing signal) try / k, z' f: C3 h! I
  4.          * to clear in anticipation of signalling.  It is OK if this
  5.          * fails or if status is changed by waiting thread.
  6.          */   f, D# [& H+ g0 }9 @1 F+ O
  7.         int ws = node.waitStatus; ( u( z4 r! W  N. h! H2 W. e
  8.         if (ws < 0) 4 v( E7 t* i& {! O$ a9 A, u! S+ E) `) D
  9.             compareAndSetWaitStatus(node, ws, 0);
  10. ! Q6 s3 y( T+ u# G
  11.         /*
  12.          * Thread to unpark is held in successor, which is normally % Z+ ?) ]" a" {; D8 b
  13.          * just the next node.  But if cancelled or apparently null,
  14.          * traverse backwards from tail to find the actual ; I2 b9 W( n: q9 s6 b+ j
  15.          * non-cancelled successor.
  16.          */ / Q8 s+ ~! X" c# e9 s
  17.         Node s = node.next; . k# f$ @6 L$ T8 x
  18.         if (s == null || s.waitStatus > 0) {
  19.             s = null; & G& Q" E% l4 A/ w+ X
  20.             for (Node t = tail; t != null && t != node; t = t.prev) 8 P/ F( O0 p+ \: y' p7 U$ H; `
  21.                 if (t.waitStatus <= 0)
  22.                     s = t;
  23.         } 5 }7 A0 {( v, q) y
  24.         if (s != null) : S4 b! Y3 j3 ~) I( }5 a! I& W: o; \
  25.             LockSupport.unpark(s.thread); / a! x% |( x  D' n, K
  26.     }
复制代码
如果没有合法的数据,从后向前遍历,为什么这么做呢?从前向后不行吗?
- ?% W" m2 y) j! {# G! k
' D( Z: K4 v7 @% b% ~9 @
lgd1152已获得悬赏 5 金钱

最佳答案

因为从前往后会遇到空指针
分享到:
回复

使用道具 举报

回答|共 1 个

lgd1152

发表于 4 天前 | 显示全部楼层

因为从前往后会遇到空指针
回复

使用道具 举报

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

本版积分规则