相似物理上的计算机系统,Java虚拟机规范中也定义了一种Java内存模型,即Java Memory Model(JMM),
来屏蔽掉各类硬件和操做系统的内存访问差别,以实现让Java程序在各类平台下都能达到一致的并发效果。html
如今最新的Java内存模型规范是JSR-133,即Java内存模型与线程规范,这套规范包含:java
理解内存模型对Java的并发编程有很大的帮助。编程
JMM决定一个线程对共享变量的写入什么时候对另外一个线程可见。
定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每一个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。
本地内存是一个抽象概念,并不真实存在,涵盖了缓存,写缓冲区,寄存器以及其余的硬件和编译器优化。数组
(1)主内存和本地内存
主内存即main memory。在java中,实例域、静态域和数组元素是线程之间共享的数据,它们存储在主内存中。
本地内存即local memory。 局部变量,方法定义参数 和 异常处理器参数是不会在线程之间共享的,它们存储在线程的本地内存中。
(2)原子性
是指一个操做是按原子的方式执行的。要么该操做不被执行;要么以原子方式执行,即执行过程当中不会被其它线程中断。缓存
重排序是指“编译器和处理器”为了提升性能,而在程序执行时会对程序进行的重排序。
重排序分为——“编译器”和“处理器”两个方面,而“处理器”重排序又包括“指令级重排序”和“内存的重排序”。
关于重排序,咱们须要理解它的思想:为了提升程序的并发度,从而提升性能!可是对于多线程程序,重排序可能会致使程序执行的结果不是咱们须要的结果!所以,就须要咱们经过“volatile,synchronize,锁等方式”做出正确的实现同步。多线程
内存屏障包括LoadLoad, LoadStore, StoreLoad, StoreStore共4种内存屏障。内存屏障是与相应的内存重排序相对应的。
经过内存屏障能够禁止特定类型处理器的重排序,从而让程序按咱们预想的流程去执行。并发
顺序一致性内存模型是理想化的内存模型。有如下规则:
(1)一个线程中的全部操做必须按照程序的顺序来执行。
(2)全部线程都只能看到一个单一的操做执行顺序。在顺序一致性内存模型中,每一个操做都必须原子执行且马上对全部线程可见。app
锁是java并发编程中最重要的同步机制。
(1)锁的内存语义:
线程A释放一个锁,实质上是线程A向接下来将要获取这个锁的某个线程发出了(线程A对共享变量所作修改的)消息。
线程B获取一个锁,实质上是线程B接收了以前某个线程发出的(在释放这个锁以前对共享变量所作修改的)消息。
线程A释放锁,随后线程B获取这个锁,这个过程实质上是线程A经过主内存向线程B发送消息。函数
(2)JMM如何实现锁
公平锁是经过“volatile”实现同步的。公平锁在释放锁的最后写volatile变量state;在获取锁时首先读这个volatile变量。根据volatile的happens-before规则,释放锁的线程在写volatile变量以前可见的共享变量,在获取锁的线程读取同一个volatile变量后将当即变的对获取锁的线程可见。post
非公平锁经过CAS实现的,CAS就是compare and swap。CAS实际上调用的JNI函数,也就是CAS依赖于本地实现。以Intel来讲,对于CAS的JNI实现函数,它保证:
禁止该CAS以前和以后的读和写指令重排序。
把写缓冲区中的全部数据刷新到内存中。
对于基本类型的final域,编译器和处理器要遵照两个重排序规则:
(1)final写:“构造函数内对一个final域的写入”,与“随后把这个被构造对象的引用赋值给一个引用变量”,这两个操做之间不能重排序。
(2)final读:“初次读一个包含final域的对象的引用”,与“随后初次读对象的final域”,这两个操做之间不能重排序。
对于引用类型的final域,除上面两条以外,还有一条规则:
(3)final写:在“构造函数内对一个final引用的对象的成员域的写入”,与“随后在构造函数外把这个被构造对象的引用赋值给一个引用变量”,这两个操做之间不能重排序。
写final域的重排序规则能够确保在引用变量为任意线程可见以前,该引用变量指向的对象的final域已经在构造函数中被正确初始化过了。其实要获得这个效果,还须要一个保证:在构造函数内部,不能让这个被构造对象的引用为其余线程可见,也就是对象引用不能在构造函数中“逸出”。
JMM经过“内存屏障”实现final,在final域的写以后,构造函数return以前,插入一个StoreStore障屏。在读final域的操做前面插入一个LoadLoad屏障。
转:http://www.cnblogs.com/binyue/p/4311232.html