内存模型笔记

问题:未正确同步代码块
对于两段理应整体互斥执行的代码块,没有做正确同步。

问题2:编译器 或者 CPU处理器 对指令的优化,导致指令重排序
编译器和处理器为了提升执行性能,可能会对指令代码进行优化,比如重排序、前向替换。注:不同的编译器、处理器的优化手段也并不相同。

以上两个问题在多线程同时 对 同一个共享变量做读写操作时,可能会导致一些令人奇怪的问题。为了解决这个问题,所以JAVA需要引入内存模型。

java内存模型究竟是什么,有什么好处?
java内存模型的目的主要是为了解决上面两个问题
1. 内存模型决定了一个线程的写操作何时会对另一个线程读操作可见。通过内存模型的可见性规则,JVM可以充分自由的对指令进行重排序,和非必要的同步移除。
2. 从代码上很容易就推断出了线程内的执行顺序。从而屏蔽了java开发人员需要去考虑底层的各种编译器、处理器做出的优化,比如乱序指令,内存模型等。

java内存模型近似模型
顺序一致内存模型
顺序一致性是指程序的执行指令是一个 全序关系,执行指令与程序的顺序一致。顺序一致性会导致编译器或者处理的优化不再合法。
从执行动作和程序代码上面看:
顺序一致性:所有的Actions的执行顺序完全相匹配于程序的代码顺序,则是顺序一致性。
顺序一致性绝对保证了 程序在执行过程中的 数据可见性和代码执行顺序,保证了每个动作的原子性以及动作影响数据的可见性。
当程序没有出现数据竞争时,所有的执行顺序都被认为是 顺序一致性。
Happens-Before内存模型(较弱)
HB只是一种表示线程内动作间的执行顺序关系,动作A对动作B可见,则动作A必须在动作B前执行。而定义HB关系主要用于强调两个有 冲突(对同一个共享变量读写)的动作之间的执行顺序。

java正式内存模型
内存模型笔记_第1张图片

线程内一致性:线程内语义决定着某个线程孤立的执行过程,指的是线程内的执行动作(根据程序所生成的动作指令)需要满足HB规则;但从堆中读取值时,值是由内存模型决定的。

线程间动作:线程间的动作是由某一线程执行,能被另一线程探测或直接影响的动作(共享变量的读写、同步、volatile,外部世界交互的动作),这些动作需要遵守同步顺序一致性、HB一致性。

java内存模型为了使得程序员能更容易的编写出并发编程程序 或者 完善内存模型,还对一些关键字的内存模型语义进行了增强。比如:volatile、final。
volatile:
1.插入内存屏障、防止处理器进行指令重排序
2.直接从主内存中读取数据
3.对volatile变量的写顺序性、原子性(long、double)

final:
final字段在构造函数被读写时,禁止重排序

jmm为什么要重新修订?
由于之前的java内存模型的一些不足,所以在Java 5以后做了重新修订,该次修订的版本一直到java 8都沿用。
1.最初的jmm不允许编译器重排序执行指令(JSR-133图2)

一些关键概念:
数据争用:
①一个线程里有个写操作
②另一个线程读取了这个写入的变量值
③且读写操作没有被同步排序

同步动作(synchronization action)任何动作只要是synchronizes-with边缘的起始或结束点,都是同步动作。(锁,解锁,读写volatile,启动线程、探测线程是否结束的动作)

同步顺序(Synchronization Order)
同步顺序指的是 同步代码块中的代码 在执行顺序上是一个顺序一致性的关系。

synchronized-with
synchronized-with可以认为是线程间的HB关系。它保证了满足synchronized-with关系的线程之间的 顺序一致性 与 可见性。jvm通过定义一些特殊语法以及线程规范来保证 程序的synchronized-with语义(线程间),使得java开发人员通过简单的语法则屏蔽了内存模型中数据争用的并发编程。
比如:volatile、final、管程、对象成员属性的初始化、线程的join、interrupt、isInterrupt等

参考资料:
http://opass.logdown.com/posts/797957-concurrency-series-4-be-with-the-synchronizes-with-relation
http://tutorials.jenkov.com/java-concurrency/java-memory-model.html
https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html
https://docs.oracle.com/javase/specs/jvms/se6/html/Threads.doc.html
JSR-133
http://blog.csdn.net/gadbee5/article/details/51539487 volatile

你可能感兴趣的:(jvm,java内存模型,并发编程)