JMM即为JAVA 内存模型(java memory model)。自己是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,经过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。是为了屏蔽系统和硬件的差别,让一套代码在不一样平台下能到达相同的访问结果。java
线程对变量的读取和写入,直接在工做内存中操做,而不能直接去操做主内存中的变量。可是这样就会出现一个问题,当一个线程修改了本身工做内存中变量,对其余线程是不可见的,会致使线程不安全的问题。数组
被synchronized关键字或其余锁包裹起来的操做也能够认为是原子的。从一个线程观察另一个线程的时候,看到的都是一个个原子性的操做。缓存
2.可见性 - 保证指令不会受 cpu 缓存的影响安全
每一个工做线程都有本身的工做内存,因此当某个线程修改完某个变量以后,在其余的线程中,未必能观察到该变量已经被修改。volatile关键字要求被修改以后的变量要求当即更新到主内存,每次使用前从主内存处进行读取。所以volatile能够保证可见性。除了volatile之外,synchronized和final也能实现可见性。synchronized保证unlock以前必须先把变量刷新回主内存。final修饰的字段在构造器中一旦完成初始化,而且构造器没有this逸出,那么其余线程就能看到final字段的值。优化
3.有序性 - 保证指令不会受 cpu 指令并行优化的影响
java的有序性跟线程相关。若是在线程内部观察,会发现当前线程的一切操做都是有序的。若是在线程的外部来观察的话,会发现线程的全部操做都是无序的。由于JMM的工做内存和主内存之间存在延迟,并且java会对一些指令进行从新排序。this