发生在JMM的核心概念之前。了解Hapens之前是理解JMM的关键。
JMM的设计需要考虑两个方面,即程序员,编译器和处理器角度的角度:
因此,JSR-133专家小组设计JMM有两个核心目标:
让我们看一下JSR-133如何通过一项代码实现这两个目标:
以下代码具有以下更改的关系:
在这三个快乐关系中,第二和第三是必要的,第一个是必要的(在A和B操作之间重新分类,并且程序执行结果不会改变)。
JMM将Hapens-Fore的要求分类为以下两类:
JMM采用了不同的策略来对这两种不同属性进行重大分类:
JMM设计示意图:
JMM设计示意图
总结:
起源:
hapens-be-befor规则源自莱斯利·兰普特(Leslie Lamport)“时间,时钟和分布式系统中事件的顺序”。本文使用hapens-在分布式系统中的事件之间定义了部分顺序。本文提供了一种分布式算法,可用于将部分关系扩展到某些全阶关系。
在Java中的申请:
JSR-133使用之前 - 在两个操作之间指定执行顺序。JMM可以通过Hapens-Fore-Fore-Fore Mange为程序员提供跨线程的内存可见性保证。
“ JSR-133:Java内存模型和线程规范”的关系如下:
happets-以前和属性语义:
从上述角度来看,发生
两者的目的是在不更改程序执行结果的情况下尽可能提高程序的执行效率。
“ JSR-133:Java模型和线程规范”定义以下Hapens-Befor
3.1挥发性写入挥发性挥发性写作 - 建立的关系之前
hapens-be之前的关系图
以上分析:
3.2 start()规则假设线程A启动线程B通过在执行过程中执行threadb.start();读取这些共享变量。
发生在与开始()程序相对应的关系图之前:
以上分析:
因此,在执行threadB.start()之前,线程A修改了共享变量,并且线程B将确保在执行线程B后可以看到线程B。
3.3 JOIN()规则假设在执行线程A期间,等待线程B通过threadB.join()终止;然后,线程B在终止之前修改了一些共享变量,然后从threadb.join()读取threadA将在threadb.join()返回后读取。这些共享变量。
join()基于程序的关系图:
以上分析:
因此,线程A执行threadB.Join()并成功返回。线程A中的任意操作对于线程A将可见。
文章总结了“ Java并行编程艺术”,下一篇文章总结了“双重检查和延迟的初始化”,因此请继续关注。