gpt4 book ai didi

java - 内存不一致或线程干扰或两者兼而有之?

转载 作者:太空宇宙 更新时间:2023-11-04 11:28:56 25 4
gpt4 key购买 nike

我在阅读有关线程的内容时从互联网上获得了这段代码。它说这是内存一致性错误的一个例子。是否只是内存不一致或线程干扰导致了意外的输出?为什么它会产生更多积极的值(value)观?它很少输出负值。

class MemoryConsistencyError extends Thread {
static int count = 0;
public void run() {
for (int x = 0; x < 1000000; x++) {
count++;
count--;
}
System.out.println(this.getName() + " count: " + count);
}
public static void main(String[] args) throws InterruptedException {
MemoryConsistencyError t1 = new MemoryConsistencyError();
MemoryConsistencyError t2 = new MemoryConsistencyError();
t1.start();
t2.start();
}
}

最佳答案

《JLS》第 17 章:

Each action in a thread happens-before every action in that thread that comes later in the program's order.

还有其他情况发生在之前,但没有一种情况适用于您发布的代码(代码中没有 synchronizestarting 或 join 线程或 volatile)。这里重要的一点是,引用中的“happens-before”适用于“ONE THREAD”。所以,不是你的情况,你有两个线程。

因此,这不是一个损坏的发生前保证(这将表明内存不一致),仅仅是线程干扰

线程干扰是由于每个 -- 或++ 操作实际上意味着三个操作:读、入或减和存储。这是两个线程的操作重叠的地方。

Why is it producing more positive values? It rarely outputs negative values.

因为行顺序使得覆盖递减存储比增量存储更容易。线程干扰使您读取过时的数据。

  1. 计数是:读取、增加、存储 (count++)
  2. 计数为:读取、减少、存储 (count--)

每个 STORE 都使用其 READ 中的值。因此,t1 读取 0,增加并存储 1。与 t2 相同。然而,t2 增加很有可能在减少后覆盖 t1 存储。反之则不然。

关于java - 内存不一致或线程干扰或两者兼而有之?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44025616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com