Happens-Before原则核心就是表达在一些条件下,前面的操作对于后面的操作是可见的。它有六个条件,或者说是六条原则。

一、线程中的顺序性原则

这个最容易理解,这个原则是指在同一个线程中,按照程序的顺序,前面的操作Happens-Before后面的操作。也就说在同一个线程中,前面先修改的数据,对于后面的操作是可见的。下面举例说明:

int a = 1;
if(a == 1){}

上面代码中第一行对变量a进行的修改Happens-Before第二行查询a的操作,所以第二行a == 1为true。

二、volatile变量原则

这个原则是指在对于用volatile修饰的变量,它的写操作Happens-Before后续对它的读操作。这个原则就是说在一个线程中先对volatile变量进行了修改后,在另一个线程中读取该volatile变量能够读到新值(因为CPU缓存的存在,可能在一个线程中修改了普通变量,另一个线程无法感知)。当然如果在同一个线程中,就可以直接使用原则一了。

volatile int a = 1;// 线程A
a = 2;// 线程B
if(a == 2){}

上面代码中,假设有两个线程并发执行,线程A先对a进行赋值操作(第四行),然后线程B立刻读取a(第七行),此时能够保证读取的a一定是2。

三、传递性

这个原则是指Happens-Before原则是可以传递的,指如果A Happens-Before B,且B Happens-Before C,那么A Happens-Before C。

volatile boolean a = false;
int b = 1;// 线程A
b = 2;
a = true;// 线程B
if(a){System.out.println(b);
}

上面代码中,线程A先对b进行赋值,然后对a进行赋值,然后线程B读取a后,然后执行打印b的值(根据原则二a一定为true),b的值一定为2。因为根据原则一,对b赋值Happens-Before对a赋值,再根据原则二,对a的赋值Happens-Before对a的读取,最后再根据原则三,对b的赋值Happens-Before对b的读取的,所以b一定为2。

四、管程中锁的原则

这个原则是指对同一个锁的解锁Happens-Before后续对这个锁的加锁。

int a = 1;// 线程执行
synchronized (this){if(a == 1){a = 2;}
}

上面代码中,线程A先对a进行赋值,然后解锁,线程B再加锁后,此时读到的a一定为2。

五、线程start原则

这条原则是关于线程启动的。它是指主线程A启动子线程B后,子线程B能够看到主线程在启动子线程B前的操作。也就是说如果线程A调用线程B的 start() 方法(即在线程A中启动线程B),那么该start()操作 Happens-Before 于线程B中的任意操作。

int a = 1;
Thread B = new Thread(() -> {// 读取a
});
a = 2; // 假设能修改
B.start();

上面代码中,线程A先对a进行赋值,然后再启动线程B,所以线程B如果能够读取a的话(当然int类型,java中是不允许的),那么a一定为2。

六、线程join原则

这条是关于线程等待的。它是指主线程A等待子线程B完成(主线程A通过调用子线程B的join()方法实现),当子线程B完成后(主线程A中join()方法返回),主线程能够看到子线程的操作。

int a = 1;
Thread B = new Thread(() -> {// 修改aa = 2;  // 假设能修改
});
B.start();
B.join();
// 读取a

上面代码中,读到的a一定为2。也就是说线程B中的操作对于B.join()后面的操作都是可见的。

source: cnblogs.com/dwtfukgv/p/15631282.html

记得点「」和「在看」↓

爱你们

Java Happens-Before 原则相关推荐

  1. java七大设计原则

    java七大设计原则 1.开闭原则(Open Close Principle) 定义:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 开放-封闭原则的意思就是说,你设计的时候,时刻要考虑,尽 ...

  2. Java 设计模式六大原则

    Java 设计模式六大原则 单一职责原则 定义:不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责. 问题由来:类T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而 ...

  3. JAVA六大设计原则 和 23种设计模式

    相关书籍:<大话设计模式>.<Java设计模式>.<设计模式之禅>.<研磨设计模式>.<Head First 设计模式> JAVA六大设计原 ...

  4. Java七大设计原则详解与运用

    开心一笑 [婚礼上,气氛正高着,主持人问新郎:"你会不会爱新娘一辈子?新郎兴高采烈的喊:"会".主持人:"你会不会在新娘容颜憔悴,疾病缠身的时候离开她? 猴急的 ...

  5. java的就近原则啥意思_java就近原则浅析

    先看下面的例子 public class Test6就近原则 { public static void main(String[] args) { A a = new A(); B b = new B ...

  6. java的继承属于哪种类型_根据Java的继承原则,如果类B继承自类A,()。_学小易找答案...

    [单选题]关于FileOutputStream的说法错误的是?( ) [单选题]在教学过程中,控制( )大小.上下.左右或任意方向进行遮盖或显示,非常适合递进式观察.(3.3分) [单选题]交互式电子 ...

  7. java 七大设计原则之依赖倒置,里氏替换原则(文字代码相结合理解)

    java 七大设计原则之依赖倒置,里氏替换原则,文字代码相结合理解 七大设计原则有哪些? 为什么要使用七大设计原则? 依赖倒置原则 里氏替换原则 喜欢就争取,得到就珍惜,错过就忘记.人生也许不尽完美, ...

  8. java开闭原则是什么?

    在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据6条原则来开发程序,从而提高软件开发效率.节约软件开发成本和维护成本.这六条分别是开闭原则.里氏代换原则 ...

  9. java最小访问原则_Android基础进阶之EffectiveJava翻译系列(第七章:通用原则)

    本章主要讨论语言的具体内容.它讨论了局部变量的处理.控制结构.库的使用.各种数据类型的使用,以及使用反射和本地方法.最后,讨论了优化和命名约定 Item 45:最小化局部变量作用域 作用域:一个花括号 ...

  10. java开闭原则 例子_解析Java编程中设计模式的开闭原则的运用

    开闭原则(Open Closed Principle)是Java世界里最基础的设计原则,它指导我们如何建立一个稳定的.灵活的系统. 定义: 一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. S ...

最新文章

  1. 浏览器允许跨域设置(不用于生产环境,开发用)
  2. 【分布式】通过Numpy创建Dask.array
  3. 独家解密:阿里是如何应对超大规模集群资源管理挑战的?
  4. c4droid语言字体颜色,关于printf如何输出颜色
  5. sql相同顺序法和一次封锁法_数学专题 | Ep01 隔板法的妙用
  6. CPU VS GPU笔记
  7. Java 完全自学手册,从外包到大厂,再到年薪 100 万技术大佬都靠它
  8. unity粒子特效与ui遮盖显示
  9. filetransferdmg魅族下载_filetransfer.dmg下载
  10. dvr行业的linux
  11. 中国到美国最安全的飞机航线
  12. win10图片打开方式里没有默认照片查看器的解决方法
  13. mdf导入虚拟主机mysql_MYSQL导入mdf文件
  14. git大坑---cleanup
  15. springboot初次使用template可能遇到的问题
  16. 图表Chart.js入门教程(附代码)包括线性、柱状、圆形、饼形图
  17. 世界各国当日数据探索性分析
  18. 力天创见户外客流统计方案
  19. 审批业务流程方案设计
  20. react native Android 键盘将底部导航栏/按钮顶起

热门文章

  1. Git本地仓库和远程仓库冲突解决
  2. 《RMPE: Regional Multi-Person Pose Estimation》论文阅读之AlphaPose
  3. 计算机检查例外 错误类型,事件查看器出现致命硬件错误,电脑频繁死机
  4. 学计算机和服装哪个好,学服装设计用什么电脑好_服装设计用什么软件
  5. windows下bat脚本自动重启Apache服务
  6. MT9813全套资料包及应用笔记
  7. PHP查找二维数组的内容
  8. 详细验证身份证号码规则和姓名(汉字)的java代码
  9. 配有双核cpu的pc计算机是第几代,电脑的CPU四核和双核有什么区别
  10. vue-tour快速入门:VUE项目中如何使用vue-tour新手引导指引插件?怎样使用?包含具体实例