系统相关
首页 > 系统相关> > 内存一致性 – 发生在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