我的程序中只有两个线程。
// Thread 1
write a = 0
write a = 1
write volatile b = 1
// Thread 2
read volatile b // this I always do after write volatile b in the 1st thread
read a
我读过Java内存模型,从线程2中我所理解的读一个总是给我1。
我想知道我的理解是否正确。
特别是可以重新排序仍然发生,所以我看到a=0在第二个线程?
你的假设基本上是正确的。不过,我会稍微重申一下,以符合JMM的保证。
如果线程2读取b
并看到值1,则随后读取的a
将为1。就像你说的,如果线程2总是在线程1写完之后读取b
,那么线程2将看到值1,读取a
将如你所期望的那样。
a)为什么除了“00”之外还有其他输出? b)如何修改代码以便始终打印“00”。 对于a)我的回答是:在没有任何volatile/同步构造的情况下,编译器可以重新排序一些指令。特别是“this.initialint=val;”和“this.flag=true;”可以切换,这样就可以发生这种情况:线程都启动了,t1充电在前面。给定重新排序的指令,它首先设置flag=true。在它到达“this.in
问题内容: 我尝试了解为什么此示例是正确同步的程序: 由于存在冲突的访问(存在对a的写入和读取),因此在每个顺序一致性中,必须在访问之间的关系之前执行。假设顺序执行之一: 是1发生-在2之前发生,为什么? 问题答案: 不,在相同变量的易失性写入之前(以同步顺序),在易失性写入 之前 不一定 会发生 易失性读取。 这意味着它们可能处于“数据争用”中,因为它们“冲突的访问未按先发生后关系进行排序”。如
当我摘录文本时,它就像 如何使文本变成一行(删除所有新行) 这是我的小提琴 http://jsfiddle.net/cod7ceho/32/
我想澄清发生前关系是如何与不稳定变量一起工作的。让我们有以下变量: 和线程A: 和线程B: 根据Java内存模型(JMM),以下语句是否正确?如果不是,正确的解释是什么? 总是发生-之前 在JMM中发生在之前,只有当它实际发生在时间之前 在JMM中发生在之前(并且将被可预测地分配)如果实际发生在
问题内容: 我有两个桌子: 1) 2) 我需要整理一下所有内容并加入 例如,对所有用户进行某种排序: 一切看起来都不错,可以排序了。之后,我加入,我的哭泣将中断: 如何与 原始分类 保存? 我无法对结果进行排序,因为* 我 在数据库中 花费约0.02s之前(约1000000个用户)就这样做了,但是当我花费约3.2s的时间后才这样做,这是非常大的时间:( * **演示:rextester.com/D
问题内容: 退货 (至少在Activestate Python 3.1实现上。) 我知道这是一个奇怪的对象,因此如果它出现在排序结果中的随机位置,我不会感到惊讶。但这也弄乱了容器中非南数的排序,这确实是出乎意料的。 我问了一个相关的问题有关,并根据我理解为什么是这样工作的。但这应该被视为错误吗? 文档只是说“返回一个新的排序列表”,而没有指定任何详细信息。 编辑:我现在同意这不违反IEEE标准。但