JMM (Java 内存模型 JavaMomary Model,简称 JMM),
在 JMM 中,如果一个操作执行的结果需要对另一个操作可见,或是代码重排序 则两个操作之间必须存在 happens-before(先行发生原则),逻辑上的先后关系
x=5 | 线程 A 执行 |
---|---|
y=x | 线程 B 执行 |
上述称之为:写后续 | y 是否等于 5 呢? |
Java 规范下 JMM 的 happens-before 原则,是判断数据是否存在竞争,线程是否安全的非常重要的手段 依赖此原则,代码编写过程就无需时时处处添加 volatile 和 synchronized 保证程序的有序性;仅通过 happens-before 原则下的规则就可以解决并发环境下两个操作之间是否可能存在冲突的所有问题,无需陷入晦涩难懂的底层编译原理中
假设存在线程 A 和 B 线程 A 调用 setValue() 线程 B 调用同一个对象 getValue() 则线程 B 的到的返回值是什么?
由于不满足 happens-before 原则, 虽然可以确定 A 线程优先于 B 线程执行,但是无法确认 B 线程最终得到的结果 该代码是线程不安全的