一、JMM与JVM
1.JVM【Java Virtual Machine】
jdk是开发java程序的用的开发包,jdk包括java运行环境jre;jre是java程序的运行环境;jvm虚拟机是java字节码的执行引擎,能够优化java字节码,使其转换成效率更高的机器指令,程序员编写的程序最终都需要在jvm上运行,jvm屏蔽了与具体操作系统平台的相关信息。
jvm模型:
(1)类装载子系统
将class文件装载到内存,对数据进行校验转换解析和初始化,最终形成可以被jvm直接使用的java类型。
(2)运行时数据区
即jvm内存管理区域,所有程序都被加载到这里,之后才开始运行。
jvm内存区域:
(3)执行引擎执行指令
(4)本地方法接口和本地方法库
是其他编程语言交互的接口,当调用native方法时就进入了一个全新的不再受虚拟机限制的世界。
2.JMM【java memory model】
JMM是JVM定义的一种模型,用来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让java程序在各种平台下都能达到一致的内存访问效果。JMM决定一个线程对共享变量的写入何时对另一个线程可见,从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存中,每个线程都有一个私有的本地内存,本地内存中存储了该线程以读/写共享变量的副本。
重排序:编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。
数据依赖性:如果两个操作访问同一个变量,且这两个操作有一个为写操作,则这两个操作之间存在数据依赖性。在单处理器中,编译器和处理器不会改变存在数据依赖关系的两个操作的执行顺序。
as-if-serial:不管怎么重排序,单线程的执行结果不能被改变。
JMM对于未同步或者未正确同步的多线程程序,JMM提供最小安全性:线程读到的要么是之前某个线程写入的值,要么是默认值0.
happens-before:这个原则是JMM最核心的概念。JMM的核心目标一是要为程序愿提供足够强的内存可见性保证二是对编译器和处理器的限制要尽可能的放松。JMM遵循一个基本原则:只要不改变程序的运行结果,编译器和处理器怎么优化都行。
happens-before:如果一个操作happens-before另一个操作,不一定前一个操作先于第二个操作先执行,而是前一个操作的结果一定会被第二个操作看见。
<1>程序顺序规则:一个线程中的每个操作happens-before于该线程中的任意后续操作。
<2>监视器锁规则:对一个锁的解锁happens-before于随后这个锁的加锁
<3>volatile变量规则:对一个volatile变量的写,happens-before于后续对这个volatile变量的额读
<4>传递性