Java内存模型及happens-before 笔记

Java内存模型主要目标:

定义程序中各个变量的访问规则,即在虚拟机中存取内存中共享变量的方法。

1)所有变量存储在主内存(JVM内存的一部分)

2)每个线程有自己的工作内存,保存主内存中对应变量的副本,所有操作在工作内存中进行。

主内存可类比为JVM堆;工作内存可类比为JVM栈。

主内存和工作内存直接交互协议:

1)lock:把主内存中的一个变量设置为线程独占状态

2)unlock:解除主内存中的一个变量的线程独占状态,使得其他线程可以lock

3)read:把主内存中的一个变量传输到线程工作内存中,供load使用

4)load:把工作内存中的传输过来的变量值放到工作内存的变量副本中?

5)use:把工作内存中的一个变量值传给执行引擎

6)assign:把执行引擎接收的值存储到工作内存中的变量中

7)store:把工作内存中的值传输到主内存中,供write使用

8)write:把主内存中的一个变量存入主内存中的变量中

happens-before定义

如果操作1的结果对操作2可见、且顺序在操作2之前,那么称操作1happens before操作2。

这并不是说操作1必须在操作2之前执行,而是说如果两个操作以不同的顺序执行(做了重排序),得出的效果无差别,检测不到两个操作乱序执行了。

单线程数据依赖性

分析单线程中两条指令的顺序依赖性,判断是否可以重排序。有三种类型不能重排序:

1)写后读:a=1;b=a;

2)写后写:a=1;a=2;

3)读后写:a=b;b=1;

对于“读后读”这种指令,对于单线程来说可以任意重排序,而不影响单线程的执行结果。

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