c++ 线程什么时候run_多线程并发支撑基础之JAVA内存模型

Java内存模型可以说是Java并发的底层支持,了解Java内存模型才能正在了解Java并发。

内存模型

在内存中设置一个变量"value = 1;"那么其他线程能在什么时候读取到这个结果呢?有可能不能立即甚至永远都读不到。比如指令顺序与源代码中的顺序不同;编译器会把变量保存在寄存器而不是内存中;处理器可以采用乱序或并行等方式来执行指令;缓存可能会改变将写入变量提交到主内存的次序,保存在处理器本地缓存中的值其他处理器是不可见的;这些情况都会导致其他线程不能读取到变量的最新值。

而Java内存模型(Java memory Model,简称JMM)则是规定了JVM在什么时候对变量的修改对其他线程可见

在多核处理器中,每个处理器都有自己的缓存,并且定期地与主内存进行协调,不同的处理器架构中提供了不同级别的缓存一致性。在现在的CPU中分了多级内存缓存比如寄存器、L1、L2、L3、内存等,每种处理器都有各自的规则和处理方式,而要保证修改变量对其他线程可见的难度就很大。

所以在JMM中抽象出来只分工作内存、主内存。主内存主要存共享变量,工作内存为每个线程拥有,存放线程需要的共享变量副本。各个线程只能读、改自己工作线程的数据,不能直接操作主内存的变量,线程修改变量时先修改工作内存变量再同步到主内存当中。

在多线程环境中,维护程序的串行性将会导致很大的性能开销,所以只有当多个线程要共享数据时,才必须协调它们之间的操作,并且JVM依赖程序通过同步操作来找出这些协调操作在何时发生。通过只分两种内存就简单很多了。

Happens-Before规则

上一节说到JVM通过依赖同步操作来找出协调操作在何时发生,而JMM就是通过各种操作来定义的。JMM对程序中的所有操作定义了一个偏序关系,称为Happens-Before

Happens-before简单解释下:如果第一个操作Happens-before第二个操作,也就是说第一个操作对于第二个操作时可见的,也就是第二个操作能够看到第一个操作的结果。

而Happens-before主要包含以下规则:

程序顺序规则:一个线程内肯定要保证执行顺序,比如两步代码前一步执行肯定要在下一步执行之前,如果不能保证规则那么如果后一步依赖前一步的结果那么肯定会出现错误。不过这个规则和指令重排冲突,但是执行重排是在保证执行结果依然符合Happens-before执行的结果下才重排,所以并不冲突。

监视器规则:对同一个锁,肯定前面一个释放了锁,后面一个才能获取到锁,只有获取到锁才能释放锁。

volatile变量规则:volatile修饰的变量在一个线程修改后,其他线程一定能够看到最新值。

线程启动规则:在主线程执行一个子线程,那么子线程的run方法一定能够看到主方法调用子线程的start方法之前的操作。

线程结束规则:主线程调用了子线程的start后如果再调用join方法,那么join方法肯定能看到子线程run方法执行的结果。

中断规则:对线程执行Interrupt方法后,那么执行interrupted和isInterrupted都能看到结果。

终结器规则:对象的构造函数必须在对象的终结器执行前完成。

传递性:A操作在B之前,B在C之前,那么A一定在C之前,也就是C一定能够看到A执行的结果。

在多线程中每个线程每段代码执行的时间是不确定的,而Happens-before则保证了单个线程内执行顺序,同时也保证在多线程哪些情况下有先后顺序。比如比如在线程A中执行了线程B的start方法和B线程的join方法,那么B线程的run方法肯定在A在调用B的start方法之后执行,也就是B中的run方法能看到之前的执行结果。同样join方法一定是run方法结束以后才能执行,也就是join之后的程序能够看到run执行的结果。

单例模式的双重检查

单例模式的一种实现方式代码如下图:

0eedb57347b20ef74823f73038f5f822.png

volatile保证了变量的可见性,就是前面讲到的volatile变量规则,在第二次验证变量singleton时才能得到的正确。如果变量没有用volatile修饰一个线程初始化了,初始化结果可能还在工作内存中,即使同步到主内存中,但是如果没有同步到其他内存中,那么其他线程就可能再次初始化。

总结

JMM实际上是由定义的一系列操作组成,这些操作确定了Java的基础特性,尤其在多线程并发方面,它主要对重排序、原子性、内存可见性这三个方面维护保证了多线程的正确执行。

Java程序员日常学习笔记,如理解有误欢迎各位交流讨论!

f98b84ebacb900e5abdececfcd2fecaf.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1476D. Journey

D. Journey 一道简单线性dp#include <bits/stdc.h> using namespace std; const int N 5e5 3; char str[N]; int a[N],b[N]; int main() {int t;cin>>t;while (t--){int n;cin>>n;cin>>str1;for (int i0;i<n;i) a[i] b[i] 1;if (str[1]L) a[1]…

润乾报表 数据集ds1中,数据源xmglxt_x3无数据库连接,且未设定数据连接工厂,请检查数据源设定:...

一、润乾报表错误内容 产生数据工厂: com.runqian.report4.dataset.SQLDataSetFactory 失败 错误来源&#xff1a;: 数据集ds1中&#xff0c;数据源xmglxt_x3无数据库连接&#xff0c;且未设定数据连接工厂&#xff0c;请检查数据源设定&#xff1a; 二、解决方法 同事做的润乾…

1388C. Uncle Bogdan and Country Happiness

C. Uncle Bogdan and Country Happiness 纯纯DFS#include <bits/stdc.h> using namespace std; const int N 1e5 3; #define int long long int a[N], b[N], c[N]; vector<int> cun[N]; int vis[N]; int ff 1; void DFS(int x) {int res 0;int xx a[x];for (…

WPF中的数据绑定Data Binding使用小结

完整的数据绑定的语法说明可以在这里查看&#xff1a; http://www.nbdtech.com/Free/WpfBinding.pdf MSDN资料&#xff1a; Data Binding: Part 1 http://msdn.microsoft.com/en-us/library/aa480224.aspx Data Binding: Part 2 http://msdn.microsoft.com/en-us/library/aa480…

awr报告分析 mysql_AWR报告的生成和简单分析方法

生成AWR报告方法&#xff1a; 第一步&#xff1a;数据库压力测试卡开始时&#xff1a;生成第一个快照&#xff1a; Sqlexec dbms_workload_repository.create_snapshot(); 第二步&#xff1a;数据库压力测试结束时&#xff1a;生成第二个快照 Sqlexec dbms_workload_repository…

1560F1. Nearest Beautiful Number (easy version)

F1. Nearest Beautiful Number (easy version) 预处理加二分#include <bits/stdc.h> using namespace std; const int N 3e5 3; #define int long long set<int>cun1,cun2; signed main() {//单个for (int i1;i<9;i){int res 0;for (int j0;j<9;j) {res …

sqlserver 微信昵称_sql server用户名和登录名的区别和联系

在SQLSERVER数据库中&#xff0c;guest帐户是特殊的用户帐户。如果用户使用USE database语句访问的数据库中没有与此用户关联的帐户&#xff0c;此用户就与guest用户相关联。另外SQLSERVER采取登录名-用户名的安全规则&#xff0c;和Oracle里面的schema有点像。SQLSERVER使用所…

1506G. Maximize the Remaining String

G. Maximize the Remaining String 贪心&#xff0c;放置时&#xff0c;如果前面一个小比他小&#xff0c;并且后面还有&#xff0c;那么就把前面的删除#include <bits/stdc.h> using namespace std; const int N 3e5 3; #define int long long string str; char ans[…

bzoj 1208

1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 9775 Solved: 3918[Submit][Status][Discuss]Description 最近&#xff0c;阿Q开了一间宠物收养所。收养所提供两种服务&#xff1a;收养被主人遗弃的宠物和让新的主人领养这些宠物。每个领养者都…

.net千万级数据导出_记一次解决docker下oracle数据库故障事例

一、问题背景&#xff1a;某个项目的线上环境oracle数据库挂了&#xff0c;同事急匆匆来找我救火。我简单咨询了一些基本情况&#xff1a;线上环境&#xff0c;docker部署&#xff0c;已正常运行半年。由于宿主机的根目录硬盘空间不够&#xff0c;运维的同事想把oracle数据文件…

1644E. Expand the Path

E. Expand the Path 一道灯下黑的题目。 我们很显然知道&#xff0c;要让每个列的上限最小&#xff0c;下限最大&#xff08;同理计算行也可以&#xff09;。 所以图形应该是一个中心对称图形 所以空白部分是一个矩形&#xff08;除了一开始的地方&#xff09;&#xff0c;但是…

Swift 将日期转化为字符串,显示上午还是下午

let dateF DateFormatter() // aaa 用于显示上午还是下午&#xff0c;mm和MM 分别表示12小时制和24小时制 dateF.dateFormat "yyyy-MM-dd aaa hh:mm:ss" dateF.amSymbol "上午" dateF.pmSymbol "下午" let str dateF.string(from: Date()) …

车间生产能耗管控方案_如何给生产车间降温 环保空调的这些方案一定能帮到你...

生产车间闷热如何降温&#xff1f;高温闷热带来的影响是非常大&#xff0c;在厂房车间闷热的环境会影响作业人员的情绪&#xff0c;增加燥热感&#xff0c;使工作效率下降&#xff0c;生产力降低&#xff0c;产品质量变差&#xff0c;蕞严重的结果导致客户流失&#xff0c;所以…

1612D. X-Magic Pair

D. X-Magic Pair 一道数学题&#xff0c;我们让a>b&#xff0c;那么如果x在a到a%b之间就可以通过a-n*b得到 然后辗转相余#include <bits/stdc.h> using namespace std; #define int long long const int mod 998244353; const int N 2e5 9; map<int, int> m…

【BZOJ2791】[Poi2012]Rendezvous 倍增

【BZOJ2791】[Poi2012]Rendezvous Description 给定一个n个顶点的有向图&#xff0c;每个顶点有且仅有一条出边。对于顶点i&#xff0c;记它的出边为(i, a[i])。再给出q组询问&#xff0c;每组询问由两个顶点a、b组成&#xff0c;要求输出满足下面条件的x、y&#xff1a;1. 从顶…

app开发人脸登录和指纹登录_易讯云通讯推出“一键登录”,为App登录提供新方案...

移动互联网时代&#xff0c;用户的耐心越来越少&#xff0c;注意力也越来越弱&#xff0c;追求便捷与高效。登录的方式从自定义的账号密码登录&#xff0c;到邮箱登录&#xff0c;到第三方登录与手机验证码登录两种登录方式进行竞争&#xff0c;到现在的个人指纹&#xff0c;人…

1641B. Repetitions Decoding

B. Repetitions Decoding 一个写起来繁琐一点的构造&#xff0c;主要是要记录到哪了。#include<bits/stdc.h> using namespace std; const int N1e6; int t,n,a[N],p[N],v,l,r,A[N],B[N],c,q[N],s; void T(int x,int y) {A[c]x,B[c]y;//A存储地方&#xff0c;B存储数值f…

可以直接考甲级吗_成人高考可以考本科吗?成人高考可以考研究生吗?

成人高考可以考本科吗?成人高考可以考研究生吗?当你选择利用成人高考的方式来提升学历的时候&#xff0c;那么我们需要了解关于成人高考的知识越多越好。成人高考可以考本科吗?成人高考可以考研究生吗?相信这是很多考生都想要了解的问题。成人高考可以考本科吗?成人高考可…

python变量和字符串

这段时间忘记更博了&#xff0c;学的太投入就一口气把python都学完&#xff0c;做了几个上手的小项目&#xff0c;自娱自乐&#xff0c;把笔记都写在百度云笔记中&#xff0c;现在就开始把所有笔记都粘贴复制分享给大家把 变量变量就是编程最基本的存储单位比如a12&#xff0c;…

1634C. OKEA

C. OKEA 一道简单的数学问题&#xff0c;一行只能有奇数或者偶数&#xff0c;进行判断就行了#include<bits/stdc.h> using namespace std; const int N1e6; int main() {int t,n,k;cin>>t;while (t--&&cin>>n>>k){int cnt (n*k1)/2;//奇数的…