Java内存模型:如何解决有序性和可见性问题

2020-11-08  本文已影响0人  潇湘哥哥

继上一篇:多线程安全问题:可见性、原子性、有序性

引言


  1. Happens-Before 的语义本质上是一种可见性
    A Happens-Before B 意味着 A 事件对 B 事件来说是可见的,无论 A 事件和 B 事件是否发生在同一个线程里。
  2. 三个关键字:synchronized、volatile、final

什么是Java内存模型

Java内存模型规范了JVM如何按需禁用内存和编译优化
具体包括:三个关键字(synchronized、volatile、final)及Happens-Before原则

Volatile关键字

  1. 原始语义,如 volatile int x = 0,表达的是:告诉编译器,对这个变量的读写,不能使用 CPU 缓存,必须从内存中读取或者写入。

final关键字

  1. final 修饰变量时,初衷是告诉编译器:这个变量生而不变,可以可劲儿优化。
  2. 避免构造函数 ”逸出“
final int x;
public FinalFieldExample() {
      x = 3;
      y = 4;
      global.obj = this; // this逸出;线程通过 global.obj 读取 x 有可能读到 0 
}

Happens-Before原则

  1. 前面一个操作的结果对后续操作是可见的
  2. 具体规则:

重点:Volatile变量规则

上一篇 下一篇

猜你喜欢

热点阅读