浅谈java内存模型
1,什么是jmm?
jmm定义了一个线程对另一个线程的可见性
jmm决定一个线程对共享变量的写入时,能对另一个线程可见
2,jmm解决了什么问题?
在多线程编程中,每个线程都有自己的内存(称为本地内存),共享变量存放在主内存中,当有多个线程同时操作一个变量时,可能因为线程没有及时刷新本地内存的数据到主内存,会有线程安全问题
jmm通过控制主内存和每个线程本地内存的交互,来为java程序员提供内存可见性保证
3, 什么时候刷新本地内存的数据到主内存?
什么时候最新的值会被刷新至主内存中是不太确定的。但是有两种方法可以保证数据及时刷新
1,关键字volatile:一旦某个线程修改了该被volatile修饰的变量,它会保证修改的值 会立即被更新到主存,当有其他线程需要读取时,可以立即获取修改之后的值。
2,关键字synchronized:synchronized关键字能够保证同一时刻只有一个线程获得锁,然后执行同步方法,并且还会确保在锁释放之前,会将对变量的修改刷新到主内存当中。
4,模型解析假设主内存中有一个共享变量x
如上图所示,本地内存A和B有主内存中共享变量x的副本。假设初始时,这三个内存中的x值都为0。线程A在执行时,把更新后的x值(假设值为1)临时存放在自己的本地内存A中。当线程A和线程B需要通信时,线程A首先会把自己本地内存中修改后的x值刷新到主内存中,此时主内存中的x值变为了1。随后,线程B到主内存中去读取线程A更新后的x值,此时线程B的本地内存的x值也变为了1。