gpt4 book ai didi

java - 两个线程在不同步的情况下访问的计数器的最小值

转载 作者:行者123 更新时间:2023-12-02 12:17:43 24 4
gpt4 key购买 nike

我在一次采访中被告知,运行以下代码后 counter 的最小值是 2。这怎么可能?

    class ThreadsConflict {
private static int counter = 0;

public static void main(String[] args) throws InterruptedException{
Thread t1 = new A();
Thread t2 = new A();
t1.start();
t2.start();

t1.join();
t2.join();

System.out.println(counter);
}

static class A extends Thread {
public void run() {
for(int i = 0; i < 10; i++) {
counter++;
}
}
}
}

我可以理解为什么如果它们交错并且++ 运算符发生冲突,它会是 10,但它怎么可能会低于 10?

最佳答案

这是因为交错发生在非原子操作之间,因此 counter++ 可以在中间中断,类似于:

int tmp = counter;
/* threads gets interrupted here */
counter = tmp + 1;

这可能会导致极端情况,例如:

  • 线程 A 读取 0
  • 线程 B 读取 0 并写入 1
  • 线程 B 读取 1 并写入 2
  • ...
  • 线程 B 读取 8 并写入 9
  • 线程 A 写入 1
  • 线程 B 读取 1
  • 线程 A 读取 1 并写入 2
  • 线程 A 读取 2 并写入 3
  • ...
  • 线程 A 读取 9 并写入 10
  • 线程 A 已完成
  • 线程 B 写入 2
  • 线程 B 已完成

请注意,这是因为 i 被用作条件,因此正好完成了 10 次迭代,如果您直接使用 counter 那么您将保证在至少 10 个。

关于java - 两个线程在不同步的情况下访问的计数器的最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46040473/

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