java的内存模型

1、概要介绍

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

规定一:线程对共享变量的全部操做,都是在本身的工做内存中完成,不能直接从主内存中获取。jvm

规定二:不一样线程直接没法直接访问他线程工做内存中的变量,必须经过借助主内存来完成。优化

2、指令重排序

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

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

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

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

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

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

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

4、synchronized实现内存可见性

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

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

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

5、volatile实现内存可见性

volatile关键字:

  • 能够保证volatile变量的原子性
  • 不能保证volatile变量符合操做的原子性

5、volatile不能保证原子性操做

6、volatile和synchronized的比较

相关文章
相关标签/搜索