happens - before: 核心:前面的动作的结果对后面的动作是可见的
volatile:volatile变量是存在主存中,故对其他线程总是可见的,同时,它修饰的变量不会被重排序。
同时(根据并发编程网的说法)在新的内存模型中,volatile周围的普通字段的也不再能够随便的重排序。
即是 当线程A写入一个volatile字段f的时候,如果线程B读取f的话 ,那么对线程A可见的任何东西都变得对线程B可见了。
class VolatileExample {
int x = 0;
volatile boolean v = false;
public void writer() {
x = 42;
v = true;
}
public void reader() {
if (v == true) {
//uses x - guaranteed to see 42.
}
}
}
即当reader线程读到了v==true的时候,那么reader线程读到x的值一定是42,而在旧的模型中,可能读到值是0.
CAS :一种乐观锁的机制 有三个值 内存值 V,预期值 A, 需要修改的值 B,当V=A的时候,才将V的值改成B Compare And Set.
ABA:CAS可能出现的问题 两个线程,1和2都读到了V,比如1线程使用了CAS,2线程做了一些操作,改变了V的值,变成了C,然后又把值变成了V,写回了内存,此时对于1线程来说,读到的值还是V,那么,1线程的 CAS完成了,然后,这并不是没有问题的。网上找了个例子:
关于ABA问题我想了一个例子:在你非常渴的情况下你发现一个盛满水的杯子,你一饮而尽。之后再给杯子里重新倒满水。然后你离开,当杯子的真正主人回来时看到杯子还是盛满水,他当然不知道是否被人喝完重新倒满。解决这个问题的方案的一个策略是每一次倒水假设有一个自动记录仪记录下,这样主人回来就可以分辨在她离开后是否发生过重新倒满的情况。这也是解决ABA问题目前采用的策略。
(作者:寻寒
链接:https://www.zhihu.com/question/23281499/answer/24112589
来源:知乎)