concurrentlinkedlist java_concurrentLinkedList中的这段代码是什么意思?

这个就是看(t != (t = tail))这句话怎么执行的了。

简化一下,看下面代码:

int i = 0;

int j = 1;

if(i != (i = j)) {

System.out.println(i);

}

这个代码,跟你的代码意思一样的,这样简化比较好理解。

对这个代码的class文件进行反编译,查看其字节码:

0: iconst_0

1: istore_1

2: iconst_1

3: istore_2

4: iload_1

5: iload_2

6: dup

7: istore_1

8: if_icmpeq 18

11: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;

14: iload_1

15: invokevirtual #3 // Method java/io/PrintStream.println:(I)V

18: return

主要的就在第0-8行,逐行分析一下:

0: iconst_0 // 0入栈,此时栈[0]

1: istore_1 // 栈顶弹出,赋值给【变量1】(即i),此时i值为0,栈[]

2: iconst_1 // 1入栈,此时栈[1]

3: istore_2 // 栈顶弹出,赋值给【变量2】(即j),此时j值为1,栈[]

4: iload_1 // 【局部变量1】(即i)的值入栈,此时栈[0]

5: iload_2 // 【局部变量2】(即j)的值入栈,此时栈[0, 1]

6: dup // 复制栈顶的值(即1),将其入栈,此时栈[0, 1, 1]

7: istore_1 // 栈顶弹出,赋值给【变量1】(即i),此时i值为1,栈[0, 1]

8: if_icmpeq 18 // 栈顶弹出两个元素(即1,0),进行比较,如果相等,跳转到18行,就是return。很明显,这里不相等,所以会继续往下走,即调用System.out.println打印。此时栈[]

可以看出,确实在发生比较之前,变量i的值已经改变了,但是栈内的元素还是旧值,所以比较还是采用旧值进行比较。

同样的道理,只不过你的代码,会改变一些指令,但是基本原理还是这样的。

你的代码比较其实就是比较t和tail,而不是赋值之后的t。

这段代码的意图就是,在当前线程执行这段代码期间,其他线程执行了其他操作,导致链表的尾部对象发生了变化,这个时候重新遍历链表,来重新确定要offer的这个对象的位置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值