Java Happens-Before 原则
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 原则相关推荐
- java七大设计原则
java七大设计原则 1.开闭原则(Open Close Principle) 定义:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 开放-封闭原则的意思就是说,你设计的时候,时刻要考虑,尽 ...
- Java 设计模式六大原则
Java 设计模式六大原则 单一职责原则 定义:不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责. 问题由来:类T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而 ...
- JAVA六大设计原则 和 23种设计模式
相关书籍:<大话设计模式>.<Java设计模式>.<设计模式之禅>.<研磨设计模式>.<Head First 设计模式> JAVA六大设计原 ...
- Java七大设计原则详解与运用
开心一笑 [婚礼上,气氛正高着,主持人问新郎:"你会不会爱新娘一辈子?新郎兴高采烈的喊:"会".主持人:"你会不会在新娘容颜憔悴,疾病缠身的时候离开她? 猴急的 ...
- java的就近原则啥意思_java就近原则浅析
先看下面的例子 public class Test6就近原则 { public static void main(String[] args) { A a = new A(); B b = new B ...
- java的继承属于哪种类型_根据Java的继承原则,如果类B继承自类A,()。_学小易找答案...
[单选题]关于FileOutputStream的说法错误的是?( ) [单选题]在教学过程中,控制( )大小.上下.左右或任意方向进行遮盖或显示,非常适合递进式观察.(3.3分) [单选题]交互式电子 ...
- java 七大设计原则之依赖倒置,里氏替换原则(文字代码相结合理解)
java 七大设计原则之依赖倒置,里氏替换原则,文字代码相结合理解 七大设计原则有哪些? 为什么要使用七大设计原则? 依赖倒置原则 里氏替换原则 喜欢就争取,得到就珍惜,错过就忘记.人生也许不尽完美, ...
- java开闭原则是什么?
在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据6条原则来开发程序,从而提高软件开发效率.节约软件开发成本和维护成本.这六条分别是开闭原则.里氏代换原则 ...
- java最小访问原则_Android基础进阶之EffectiveJava翻译系列(第七章:通用原则)
本章主要讨论语言的具体内容.它讨论了局部变量的处理.控制结构.库的使用.各种数据类型的使用,以及使用反射和本地方法.最后,讨论了优化和命名约定 Item 45:最小化局部变量作用域 作用域:一个花括号 ...
- java开闭原则 例子_解析Java编程中设计模式的开闭原则的运用
开闭原则(Open Closed Principle)是Java世界里最基础的设计原则,它指导我们如何建立一个稳定的.灵活的系统. 定义: 一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. S ...
最新文章
- 浏览器允许跨域设置(不用于生产环境,开发用)
- 【分布式】通过Numpy创建Dask.array
- 独家解密:阿里是如何应对超大规模集群资源管理挑战的?
- c4droid语言字体颜色,关于printf如何输出颜色
- sql相同顺序法和一次封锁法_数学专题 | Ep01 隔板法的妙用
- CPU VS GPU笔记
- Java 完全自学手册,从外包到大厂,再到年薪 100 万技术大佬都靠它
- unity粒子特效与ui遮盖显示
- filetransferdmg魅族下载_filetransfer.dmg下载
- dvr行业的linux
- 中国到美国最安全的飞机航线
- win10图片打开方式里没有默认照片查看器的解决方法
- mdf导入虚拟主机mysql_MYSQL导入mdf文件
- git大坑---cleanup
- springboot初次使用template可能遇到的问题
- 图表Chart.js入门教程(附代码)包括线性、柱状、圆形、饼形图
- 世界各国当日数据探索性分析
- 力天创见户外客流统计方案
- 审批业务流程方案设计
- react native Android 键盘将底部导航栏/按钮顶起
热门文章
- Git本地仓库和远程仓库冲突解决
- 《RMPE: Regional Multi-Person Pose Estimation》论文阅读之AlphaPose
- 计算机检查例外 错误类型,事件查看器出现致命硬件错误,电脑频繁死机
- 学计算机和服装哪个好,学服装设计用什么电脑好_服装设计用什么软件
- windows下bat脚本自动重启Apache服务
- MT9813全套资料包及应用笔记
- PHP查找二维数组的内容
- 详细验证身份证号码规则和姓名(汉字)的java代码
- 配有双核cpu的pc计算机是第几代,电脑的CPU四核和双核有什么区别
- vue-tour快速入门:VUE项目中如何使用vue-tour新手引导指引插件?怎样使用?包含具体实例