Java内存模型

138 阅读1分钟

总览

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标识此方法为同步方法