JVM 先行发生原则(happens-before)

2019-01-14  本文已影响2人  SlowGO

1. 什么是先行发生原则(happens-before)

先行发生是Java内存模型中定义的两项操作之间的偏序关系,如果说操作A先行发生于操作B,就是说A产生的影响能被B观察到,”影响“包括修改了内存中的共享变量值、发送了消息、调用了方法等。

例如:

// 线程A中执行
i = 1;

// 线程B中执行
j = i;

// 线程C中执行
i = 2;

如果说线程A是先行发生于线程B的,那么可以确定在线程B执行之后 j=1,因为根据先行发生原则,A操作 i = 1 的结果可以被B观察到,并且线程C还没有执行。

那么如果线程C是在A与B之间,j 的值是多少呢?答案是不确定。

2. 自动实现先行发生的规则

以下是Java内存模型中天然的先行发生规则,对于不在此列的关系,就没有顺序性保障,虚拟机可以随意的进行重排:

3. 示例

private int value = 0;
public void setValue(int value) {
    this.value = value;
}
public int getValue(){
    return value;
}

假设有2个线程 A 和 B,A 先调用了 setValue(1),然后 B 调用 get 方法,那么 B 的返回值是什么?

我们对照一下上面的那些原则:

所以,B 的返回值无法确定,就是说线程不安全。

上一篇下一篇

猜你喜欢

热点阅读