CoDeleven

Results 3 comments of CoDeleven

## 第一个问题 compareAndSetTail代码如下: ` private final boolean compareAndSetTail(Node expect, Node update) { return unsafe.compareAndSwapObject(this, tailOffset, expect, update); } ` tailOffset就是tail域在AQS对象里的偏移量,用CAS更新尾结点。第一个不用猜测,点进去看看就知道了 ## 第二个问题 从设计上我实在讲不出什么,只能说返回tail没什么意义,可以从以下几点理解 1. enq(node)可以简单地理解为插入吧?CAS操作成功后,node即tail,你传了一个node,返回一个一样的node有什么意义呢? 2. 看transferForSignal(node),它的作用是唤醒node结点,根据AQS的规定,需要将前一个结点,即node.prev设置成SIGNAL状态。这部分看Condition部分 :) 我也是最近才开始看并发的内容,感觉能有人一起讨论问题还是挺好的,你可以加我QQ:624684849 ,一起讨论问题

可以保证。可以从两个方面理解: 内存屏障: volatile关键字会在volatile写之前插入StoreStore,保证volatile写之前的内容先写入主内存,保证对所有线程可见(禁止a写和flag写的重排序);而volatile读后会插入LoadLoad和LoadStore,保证在读取变量a前,先读取flag(禁止a读和flag读重排序)。所以就能保证它们的可见性。 happens-before: 作者的代码没看,你可以看我的理解一下 /捂脸 ![image](https://user-images.githubusercontent.com/20849278/40033994-8981ccf4-582d-11e8-8902-ff20a6388661.png) 最后根据传递性规则,① happens-before ④

lock开头的指令是在JIT的汇编代码里 参考周志明的《深入Java虚拟机》P111