Java 并发 --内存模型

内存模型—JMM

源代码中的指令顺序和实际运行时的指令顺序可能是不同的,编译器出于优化的目的,会对指令进行「重排序」,会采用乱序或并行等方式来执行指令,它只要满足一个条件即可:「程序的最终结果与在严格串行环境中执行的结果相同」。在这种情形下,如果另一个线程坐在那观察某个执行过程中的线程,会发现该线程的执行过程是不可预测的,在这个时候得到的状态也是无效的,这就是安全发布的必要性。
除此之外,JMM 中每个线程有自己的本地的缓存(也就是下图中的工作内存),如果某个线程更新变量之后没有及时同步到主内存,其他线程是看不到更新后的值的,这就带来可见性的问题,但这在缓存一致性的要求上是满足最小保证的:允许不同的处理器再任意时刻从同一个存储位置上看到不同的值。

  1. 如果我们要保证执行操作 B 的线程看到操作 A 的结果,那么在 A 和 B 之间必须满足先行发生原则(happens-before)
  2. 管程锁定规则(Monitor Lock Rule):同一个锁的 unlock 操作先行发生于后面(时间上先后)的 lock 操作
  3. volatile 变量规则(Volatile Variable Rule):对一个 volatile 变量的写操作先行发生于后面(时间上先后)对这个变量的读操作。

类加载模型

  • A 加载B 时 加载不到 B
    • 这时 B 类刚加载到内存,还有进行赋值 操作,而A 的引用指向了B
    • 使用 happenbefre,在A 类加载完后在加载B

猜你喜欢

转载自blog.csdn.net/yuansiyuan123/article/details/83958769