总览
JMM(Java Memory Model)是保证了Java程序在所有平台下对内存的访问都能得到一致效果的机制以及规范,它是一个抽象的概念并不是真实存在的。 它的实现依托于Java在不同的操作系统上进行了一层抽象(即JVM)
在JMM的抽象下,所有变量都存储在主内存中,每一条线程都有自己的工作内存,工作内存中保存着此线程用到的变量在主内存的数据副本, 线程只能访问自己工作内存的变量,数据的同步由JMM控制
volatile
作用:
1. 当一个变量被 volatile 修饰时,那么对它的修改会立刻刷新到主存,当其它线程需要读取该变量时,会去内存中读取新值。
即写操作直接将值刷新到主内存,
读操作直接从主内存中读取
2.禁止指令重排序
问题:
使用了volatile之后并不代表万事大吉。 想象一种情况。如果线程a在线程b读到变量g之后才对变量g进行了修改,即使对变量g的修改立即刷新到了主存,但是由于线程b之前已经读到了变量g,所以不会再去读第二遍变量g最新的值。
synchronized
作用:
保证同一时刻只允许一条线程操作一块的代码
实现方式:
修饰代码块时:底层使用的是 monitorenter 和 monitorexit 指令,其中 monitorenter 指令指向同步代码块的开始位置,monitorexit 指令则指明同步代码块的结束位置
修饰方法时:使用ACC_SYNCHRONIZED标识此方法为同步方法