Java并发编程 | java 内存模型FAQ - 背景介绍

http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#reordering

1.背景:内存模型是啥?

  • 背景:处理器和内存的速度差异较大,为了提高程序性能,处理器和内存之间加了多层缓存;
  • 问题:但是,多处理器系统中,由于每个处理器之间的缓存不是共享的,这就会有数据一致性问题;也就是多线程的可见性问题。
  • 解法:内存屏障(memory barriers)是一种特殊的机器指令,可以解决可见性的问题,它可以把处理器本地缓存刷新到主存。可以把多线程的执行序列近似转换为唯一确定的时间序列。高级语言的lock和unlock时会加入内存屏障。
  • 概念:我理解的JMM(Java内存模型)就是保证并发编程正确性以及线程和内存如何交互的规范。主要是规范代码变量和底层存储的关系;通过限制编译器以及处理器的一些优化行为来保证并发编程的正确性。

2 重排序的含义(有序性问题)

  • 编译器会做一些优化,对java字节码进行重排序;
  • 处理器为了提高并行度,也会对机器码进行重排序;
  • 运行时JIT也会做一些重排序优化。
  • 有序性问题:重排序的前提是遵循 as-if-serial语义,就是重排序不会改变单线程里的执行结果。但是无法保证并发场景下的执行结果。

3 老版本JMM的问题

  • final域问题:B线程在不同时间看到A线程的final域会不同,开始看到的是为初始化的默认值,隔一会儿看到的是构造函数的值,例如String类型的值会改变。
  • volatile问题:volatile变量会和普通变量发生重排序,会给开发者带来困扰。
  • JSR-133中均增强了这两者的内存语义,就是加入了更多的内存屏障;

猜你喜欢

转载自blog.csdn.net/mike_learns_to_rock/article/details/88095493