编程语言
首页 > 编程语言> > Java的JMM理解

Java的JMM理解

作者:互联网

1. JMM的可见性: 

  JMM的可见性时指,当一个线程频繁读取某一个变量的时候,会把该变量的值从主存缓存到自己的工作内存中,那么该线程在后续读取的过程中,就直接从自己的工作内存中读取即可,不会从主存中就进行读取,当其他线程对主存中的值进行修改时,这个线程时发现不了的,这就是可见性问题,可以使用volatile关键字来防止这种问题,当变量加了volatile修饰之后,每次其他线程读取变量的值的时候,就会从主存中读取

2. JMM的有序性:

  CPU为了提高执行效率,会对一些线程的指令进行重排序,从而达到指令交错执行,提高多线程执行效率,这样也会引发一系列的安全问题,也可以为变量加上volatile关键字来阻止指令重排,原理是被volatile修饰的变量会在变量读写操作时分别加上读屏障和写屏障(屏障是和读写操作挨着的),读屏障就是,不会让该变量后边的操作重排到读屏障的前面去,写屏障就是不会让该变量前面的操作重排到写屏障的后面去,这样就阻止了指令重排的问题

3.Happens Before规则

  1) 线程执行start前的操作对线程是可见的

  2) synchronized中的执行的操作,对后续线程是可见的

  3) 打断线程前执行的操作,对调用isInterrupted()后是可见的

  4) 传递性: 如果a操作 对 b操作可见 b操作 对 c操作可见 那么a操作 对 c操作时可见的

  5) 线程结束前的操作,对感知到它结束的线程时可见的 比如调用(isAlive or join)方法

  6) 对volatile变量的操作,对接下来其他线程是可见的

标签:volatile,Java,变量,可见,理解,线程,JMM,操作,读取
来源: https://www.cnblogs.com/arnold-ygq/p/16323279.html