BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #66185同步于 2022/1/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

【问题】多线程编程中顺序一致性模型和happens-before怎么理解

mozhu123
2022/1/20镜像同步21 回复
在Java并发编程的艺术中看的,云里雾里的没看明白。 顺序一致性模型解决什么问题?什么是顺序一致性模型?怎么解决问题的? happens-before解决什么问题?什么是happens-before?怎么解决问题的? A happens-bofore B什么意思?我开始简单的理解为A发生在B之前,后来又看到“happens-before不是简单的A发生在B之前,而是B想要看到A的操作,那么需要操作之间必须存在happens-before关系” 希望看到的大佬不吝赐教,感谢!
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
kevinSpacey机器人#1 · 2022/1/20
bd
SCSsong机器人#2 · 2022/1/20
涉及到概念:可以看看 Java 的内存模型和多线程。 背景:单个线程内,逻辑上来说,是一个顺序执行流,但在物理上,由于编译优化,可能会对没有依赖关系的语句进行指令重排。 现在来看看多线程时,有几个线程可能会同时更新同样的全局资源(比如说全局变量 a),那某个时刻 a 的值是多少怎么确定呢?就得确定一个线程中事件(比如对 a 的更新)发生的顺序,才能确定任意时刻 a 的值。而 happens-before 就是来确定这个顺序的。可以使用的手段有:加锁,消息传递,就线程间同步那一套。
guoyuanchao机器人#3 · 2022/1/20
happens before就是一个纯概念,可以拿到其他场景用,就是一个描述先后顺序的词语,不闭深究
Chenrjabc机器人#4 · 2022/1/20
这个不能光靠Java基本语法去理解,得把一些多核cpu流水线发射的相关的计组相关的知识点结合起来。可以认为Java语言的sycheonized和lock等等的实现必须建立在happens-before的基础上,它描述了在多核处理器并发下最基本的规则 可以看看https://blog.csdn.net/javazejian/article/details/72772461
mozhu123机器人#5 · 2022/1/20
多谢 【 在 SCSsong 的大作中提到: 】 : 涉及到概念:可以看看 Java 的内存模型和多线程。 : 背景:单个线程内,逻辑上来说,是一个顺序执行流,但在物理上,由于编译优化,可能会对没有依赖关系的语句进行指令重排。 : 现在来看看多线程时,有几个线程可能会同时更新同样的全局资源(比如说全局变量 a),那某个时刻 a 的值是多少怎么确定呢?就得确定一个线程中事件(比如对 a 的更新)发生的顺序,才能确定任意时刻 a 的值。而 happens-before 就是来确定这个顺序的。可以使用的手段有:加锁,消息传递,就线程间同步那一套。 : ............
mozhu123机器人#6 · 2022/1/20
好文! 【 在 Chenrjabc 的大作中提到: 】 : 这个不能光靠Java基本语法去理解,得把一些多核cpu流水线发射的相关的计组相关的知识点结合起来。可以认为Java语言的sycheonized和lock等等的实现必须建立在happens-before的基础上,它描述了在多核处理器并发下最基本的规则 : 可以看看https://blog.csdn.net/javazejian/article/details/72772461 : ............
knight0机器人#7 · 2022/1/21
happen-before是lamport提出的,可以去看论文Time,Clocks and the Ordering of Events in a Distributed System
llyzltz机器人#8 · 2022/1/21
硬件有多种多样,结合语言实现,如何对上提供一个统一的方便的编程(或管理),,所以出来了一致性模型等等,其实现如jmm等。但是JAVA语言的内部设计和实现,如多线程/并发等,这时就出现了happens-before
snowskye机器人#9 · 2022/1/21
如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。 两个操作之间存在happens-before关系,并不意味着Java平台的具体实现必须要按照 happens-before关系指定的顺序来执行。如果重排序之后的执行结果,与按happens-before关系来执行的结果一致,那么这种重排序并不非法,也就是指令重排不会被限制。