gpt4 book ai didi

java - 核心java中的原子问题

转载 作者:行者123 更新时间:2023-12-03 06:20:47 25 4
gpt4 key购买 nike

这是核心 Java 8 版第 757 页的一部分

注意:

public void flipDone() {
done = !done;
}

//非原子

我不明白为什么它不是原子的。谁能告诉我为什么?谢谢

最佳答案

flipDone 方法由计算机分三个不同的步骤执行:

Read the value of memory location labeled done into ALU
Flip the value (i.e true -> false or false -> true)
Write the new value into the memory location done

在 Java 中,一段代码可能会在多个线程中调用。这些线程应该被认为是并发执行代码。

假设,标记为“done”的内存位置最初包含值“false”。考虑两个线程调用 flipDone,导致以下步骤序列:

Thread 1                             Thread 2
-----------------------------------------------------------------------
Read value of done, false
Invert that value to true
Write the new value, true, to done
Read value of done, now true
Invert that value to false
Write the new value, false, to done

flipDone 方法被调用两次。正如人们所期望的那样,donefalse 变为 true,然后又回到 false。但由于线程同时执行,这并不是唯一的步骤顺序。请考虑以下顺序:

Thread 1                             Thread 2
-----------------------------------------------------------------------
Read value of done, false
Invert that value to true Read value of done, false
Write the new value, true, to done Invert that value to true
Write the new value, true, to done

当第一个线程反转其读取的值时,第二个线程同时读取该值。同样,当第一个线程将值写入内存时,第二个线程正在反转它读取的值。当Thread 2完成时,done的值为true。在这里,虽然 flipDone 被调用了两次,但 done 只被翻转了一次!其中一项更新似乎已丢失。这就是本书试图警告您的问题。

关于java - 核心java中的原子问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6079883/

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