java的内存模型

194 阅读2分钟

一、概要介绍

java内存模型,描述了java程序中各种变量(线程共享变量)的访问规则。以及在jvm中将变量存储到内存中读取出变量这样的底层细节。

规定一:线程对共享变量的所有操作,都是在自己的工作内存中完成,不能直接从主内存中获取。

规定二:不同线程直接无法直接访问他线程工作内存中的变量,必须通过借助主内存来完成。

二、指令重排序

定义:代码书写的顺序,与执行的顺序不一致,重排序是为了使编译器或处理器更高的效率执行程序。

1.编译器优化的重排序(编译器优化)

2.指令集并行的重排序(处理器优化)

3.内存系统的重排序(处理器优化)

三、共享变量可见性实现的原理。

线程1对共享变量的修改想要被线程2及时看到,必须经过如下步骤:

  • 把工作内存1中更新的共享变量刷新到主内存中
  • 把主内存中更新的变量情况,同步到工作内存2中

四、synchronized实现内存可见性

JMM关于synchronized的两条规定(保证线程在下次加锁前获取到的数据是最新的):

  • 线程在解锁前,必须把共享变量的最新值,更新到主内存中去。
  • 线程加锁时,将清空工作内存中共享变量的值从而使用从主内存中最新copy的最新副本数据。(特别注意:加锁和解锁必须是同一把锁)

synchronized实现可见性(实现互斥): 步骤一:获得互斥锁。 步骤二:清空工作内存。 步骤三:从主内存中copy最新的变量副本到工作内存。 步骤四: 执行代码。 步骤五:将工作内存中的修改的共享变量同步更新到主内存中。 步骤六:释放互斥锁。

五、volatile实现内存可见性

volatile关键字:

  • 可以保证volatile变量的原子性
  • 不能保证volatile变量符合操作的原子性

五、volatile不能保证原子性操作

六、volatile和synchronized的比较