gpt4 book ai didi

java - 线程干扰实际上是如何发生在 `Counter` 示例类中的?

转载 作者:行者123 更新时间:2023-11-30 06:10:31 25 4
gpt4 key购买 nike

我正在尝试学习线程干扰的概念,并且在 Java 教程 Oracle 中遇到了以下示例:

class Counter {
private int c = 0;

public void increment() {
c++;
}

public void decrement() {
c--;
}

public int value() {
return c;
}

}

Oracle 教程提到,如果有两个线程尝试访问变量 c,则可能会导致线程干扰,其中一个线程所做的更改不会被另一个线程看到。

但是,它没有提供任何代码来实际解释这个概念。有人可以提供一个基于 Counter 类的代码示例来演示线程干扰实际上是如何发生的吗?

最佳答案

比起代码,我更喜欢解释会发生什么。假设 2 个线程,A 和 B 正在访问相同的计数器对象A 调用incrementB 调用递减。这些操作中的任何一个都至少包含 3 个步骤。

  1. 从内存中读出C
  2. 递增或递减C
  3. C写回内存。

当 A 和 B 尝试同时递增和递减时,一个线程可能从内存中读取 C(第 1 步),而另一个线程正在第 2 步。在这种情况下,如果 c 的初始值为 5,首先线程 A 读取并将其递增到 6。然后线程 B 读取并将其递减到 4。请记住,B 在 A 完成写入之前进行这些更改c 回到内存中。由于步骤重叠,一个线程所做的更改对另一个线程不可见,导致 c 的最终值为 6 或 4。但实际上我们预期的是 5

这是两个线程相互干扰的例子。为避免这种情况,我们使用线程同步。

关于java - 线程干扰实际上是如何发生在 `Counter` 示例类中的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35678686/

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