高并发编程-happens-before

happens-before是Java内存模型中定义的两个操作之间的偏序关系,即如果操作A在操作B之前先发生,那么操作A产生的操作结果,操作B可以观察到,或者说操作A的结果影响到操作B。笔者认为Java内存模型中的这种与生俱来的原则实现了可见性和顺序性。

happens-before无需任何同步器的协助,只要两个操作之间的关系符合以下列出的这些规则,或者可以由以下这些规则推导出,那么就可以保证它们的顺序性,否则Java虚拟机可以进行任意重排序。

程序次序规则

在一个线程内,按照控制流顺序,书写在前面的操作先行发生于书写在后面的操作

管程锁定规则

一个unlock操作先行发生于后面对同一个锁的lock操作。

volatile变量规则

对一个volatile变量的写入操作先行发生于后面对这个变量的读操作。

线程启动规则

Thread对象的start()方法先行发生于此线程的每一个动作。

线程终止规则

线程中的所有操作都先行发生于对此线程的终止检测。

线程中断规则

对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生,可以通过Thread.interrupt()方法检测到是否有中断发生。

对象终结规则

一个对象的初始化完成(构造函数执行结束)先行发生于它的finalize()方法的开始。

传递性

如果操作A先行发生于操作B,操作B先行发生于操作C,那么就可以得出操作A先行发生于操作C。

原文发布于微信公众号 - JavaQ(Java-Q)

原文发表时间:2018-11-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏搜云库

Scala-2.13.0 安装及配置

Scala 简介 Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。 Scala 运行在J...

257100
来自专栏极客猴

Python 三种遍历目录的方法,轻松帮你找出隐藏文件

无论在 Windows 系统中还是 Linux 系统中,都存在着隐藏文件以及隐藏文件夹。隐藏文件夹一般是系统关键性目录,例如 Windows 系统中的 C 盘中...

68820
来自专栏社区的朋友们

django 初始化默认数据的一个方法

经常可能会有的一个需求就是,一个表中会有一些默认数据,这些数据未来是可以通过管理端来配置的。所以数据库在被建立之后,会有一些默认数据被插入表中。

2.8K30
来自专栏狮乐园

尝鲜 workerize 源码

最近正好在看web worker相关的东西,今天无意中就看到了github一周最热项目的推送中,有这么一个项目workerize,repo里的文档的描述如下:

18820
来自专栏磨磨谈

rbd的image对象数与能写入文件数的关系

对于这个问题,我原来的理解也是:对象默认设置的大小是4M一个,存储下去的数据,如果小于4M,就会占用一个小于4M的对象,如果超过4M,那么存储的数据就会进行拆分...

12120
来自专栏黑泽君的专栏

c语言基础学习02_helloworld

============================================================================= 涉及...

18610
来自专栏Porschev[钟慰]的专栏

Nodejs学习笔记(三)--- 模块

简介及资料 通过Node.js的官方API可以看到Node.js本身提供了很多核心模块 http://nodejs.org/api/ ,这些核心模块被编译成二进...

26980
来自专栏码生

django 学习笔记三

拦截到url 后,通过拦截到的URL和 request 做一些不同的响应(response)

11720
来自专栏技巅

Glusterfs之rpc模块源码分析(中)之Glusterfs的rpc模块实现(1)

19230
来自专栏数据结构与算法

22:紧急措施

22:紧急措施 总时间限制: 1000ms 内存限制: 65536kB描述 近日,一些热门网站遭受黑客入侵,这些网站的账号、密码及email的数据惨遭泄露。你...

39380

扫码关注云+社区

领取腾讯云代金券