Java 内存 关系_内存一致性 – 发生在Java之前的关系

参见英文答案 > How to understand happens-before consistent                                    4个

在阅读有关内存一致性错误的Java文档时.我找到了与两个创造事件相关的点 – 在关系之前:

>当一个语句调用Thread.start()时,每个语句都有一个

发生 – 在与该陈述的关系也有一个

发生在与新执行的每个语句的关系之前

线.导致创建的代码的影响

新线程对新线程可见.

>当一个线程终止并在另一个线程中导致Thread.join()时

返回,然后终止执行的所有语句

线程与所有语句之间具有发生在之前的关系

成功加入后.线程中代码的影响

现在可以看到执行连接的线程.

我无法理解他们的意思.如果有人用一个简单的例子解释它会很棒.

解决方法:

现代CPU并不总是按照更新的顺序将数据写入内存,例如,如果运行伪代码(假设为了简单起见,变量总是存储在内存中);

a = 1

b = a + 1

…在写入内存之前,CPU可以很好地将b写入内存.只要你在一个线程中运行东西,这就不是一个真正的问题,因为一旦完成赋值,运行上面代码的线程将永远不会看到任一变量的旧值.

多线程是另一回事,您认为以下代码会让另一个线程获取繁重计算的值;

a = heavy_computation()

b = DONE

……另一个线程……

repeat while b != DONE

nothing

result = a

但问题是在将结果存储到存储器之前可以在存储器中设置完成标志,因此另一个线程可以在将计算结果写入存储器之前获取存储器地址a的值.

同样的问题 – 如果Thread.start和Thread.join没有“发生之前”保证 – 给你代码的问题,如;

a = 1

Thread.start newthread

...

newthread:

do_computation(a)

…因为当线程启动时,a可能没有存储到内存的值.

由于您几乎总是希望新线程能够使用在启动之前初始化的数据,因此Thread.start具有“之前发生”保证,即,在调用Thread.start之前已更新的数据保证可用于新线程. Thread.join也是如此,新线程写入的数据保证在终止后连接它的线程可见.

它只是使线程更容易.

标签:java,java-util-concurrent,happens-before

来源: https://codeday.me/bug/20190925/1817231.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值