java内存模型(Java Memeory Model)

1、java内存模型的重要目标是定义程序中各个访问变量的访问规则,即在虚拟机中将变量存储到内存,和从内存中取出变量的低层细节;这里所说的变量主要包括实例字段,静态字段,构成数组对象的元素不包括局部变量与方法参数;
2、java内存模型分为主内存和工作内存,每个线程都拥有自己的工作内存;java线程通过read操作从主存中读取共享变量,再通过load操作将read读取的变量载入工作内存的变量副本中,此时java线程独占变量副本可以对变量进行use和assign(赋值操作),然后通过store操作将变量的值从工作内存中传送到主存中,最后通过write操作将store操作传过来的变量的值写入主内存的变量中。java内存模型规定read和load,store和write的操作不能单独出现,即不允许出现从主内存中读取而工作内存不接受或者从工作内存中执行回写而主内存不接受这样的情况;

《java内存模型(Java Memeory Model)》
3、如果对一个变量进行lock操作,那么会清空工作内存中此变量的值,在执行引擎使用这个变量前,需要重新执行load或assign操作初始化变量的值,对一个变量执行unlock操作之前必须先把变量的值回写到主内存中;
4、volatile型变量的特殊规则
一个变量定义为volatile后,它具有两种特性:1)保证所有线程对该变量的可见性,即当一个线程改变了该变量的值,另一个线程能立马得到该变量的新值;对于普通变量要保证可见性,线程必须在主存中通信,即一个线程改变普通变量的值,store和write操作回写到主存然后其它线程通过read和load操作在主存中读取这个普通变量的值;2)、禁止指令重排序,编译后的结果显示对volatile变量多执行了一个lock add1 $0x0的空操作,这个操作相当于一个内存屏障,使重排序时不能把后面的指令重排到内存屏障之前,通过lock操作使得本CPU的Cache写入内存,使得别的CPU无效化器Cache,这个操作相当于对Cache中的变量作了一次java内存模型中的store和write操作,从而保证对volatile变量的操作对其他CPU立即可见;在工作内存中每次使用volatile变量时,都必须要先从主内存中刷新最新的值,用于保证看见其他线程对volatile变量的修改;
5、先行发生原则(happens-before)
java内存模型中先行发生原则指的是:一个操作先行发生在另一个操作前面,前一个操作产生的影响能被后一个操作观察到;它是判断数据是否存在竞争,线程是否安全的主要依据;

    原文作者:java内存模型
    原文地址: https://blog.csdn.net/m0_37742889/article/details/78885603
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞