Java多线程编程---内存可见性

什么是JAVA 内存模型

        Java Memory Model (JAVA 内存模型)描述线程之间如何通过内存(memory)来进行交互。具体说来,JVM中存在一个主存区(Main Memory或Java HeapMemory),对于所有线程进行共享,而每个线程又有自己的工作内存(Working Memory),工作内存中保存的是主存中某些变量的拷贝,线程对所有变量的操作并非发生在主存区,而是发生在工作内存中,而线程之间是不能直接相互访问,变量在程序中的传递,是依赖主存来完成的。具体的如下图所示:

Java多线程编程---内存可见性_第1张图片

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

        所有的变量都存储在主内存中,每个线程都有自己独立的工作内存,里面保存该线程使用到的变量的副本(主内存中变量的一份拷贝)。

        JMM的有两条规定

        1、线程对共享变量的所有操作都必须在自己的工作内存中进行,不能直接从主内存中读写;

        2、不同的线程之间无法直接访问其他线程工作内存中的变量,线程变量值的传递需要通过主内存来完成。

 

内存可见性

        可见性:是指一个线程对共享变量值的修改,能够及时地被其他线程看到。

        共享变量:如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量。

        共享变量可见性实现的原理:线程1对共享变量的修改要想被线程2及时看到,必须要经过如下2个步骤:

        1、把工作内存1中更新过的共享变量的值刷新到主内存中;

        2、把主内存中最新的共享变量的值更新到工作内存2中。

        指令重排序:代码书写的顺序与实际的执行顺序可能不同,指令重排序是编译器或处理器为了提高程序性能而做的优化。

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

        2、指令级并行重排序(处理器优化);

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

 

        而导致共享变量在线程间不可见的主要原因:

        1、线程的交叉执行;

        2、重排

你可能感兴趣的:(Java多线程,Java多线程—并发,Java多线程,synchronized,volatile,内存可见性)