gpt4 book ai didi

没有同步的 Java 多线程行为

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:15:57 24 4
gpt4 key购买 nike

我在面试中遇到了以下问题:

让我们假设一个简单的类

public class Example{

private int a;

public void update(){

a = some new value;
}

public int getA(){

return a;
}

}

现在有 2 个线程(T1 和 T2)按以下顺序读取和更新 a 值:

T2 (call update() and the value was set to 1)
T1 (call getA())
T2 (call update() and the value was set to 2)
T1 (call getA())

线程T1的最后一次调用getA()是否有可能返回值1?如果是,在什么情况下?

最佳答案

对 T1 的最后一次调用可能返回 0、1 或 2。问“在什么情况下”确实没有意义。在运行这段代码的情况下,基本上。代码不是为并发而编写的,因此无法保证。

为了保证一个线程对变量的写入对于另一个线程对该变量的读取是可见的,线程之间需要有一个同步点。否则,允许 JVM 以更改仅对创建它们的线程可见的方式进行优化。例如,写入线程的当前值概念可以缓存在处理器上,稍后或永远不会写入主内存。当另一个线程读取主内存中的值时,它会找到初始值 (0)、陈旧更新 (1) 或最新更新 (2)。

在这种情况下,最简单的解决方法是将 a 声明为 volatile 变量。您仍然需要一些机制来确保 T2 在 T1 读取之前写入,但只是在弱的挂钟意义上。

关于没有同步的 Java 多线程行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35516776/

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