gpt4 book ai didi

java - 混淆java线程变量可见性

转载 作者:搜寻专家 更新时间:2023-10-31 20:06:05 24 4
gpt4 key购买 nike

我发现所有关于可见性的例子都是原始类型的例子。我想知道的是:如果一个对象在堆中新建,当一个线程调用它的方法来改变它的状态时,没有锁定或同步,其他线程会看到这种变化吗?想象一个 Java.Collection 对象,一个线程调用它的 add() 方法

有人说堆中的对象仍然存在可见性问题,但 JLS 说:17.4.1 共享变量可以在线程之间共享的内存称为共享内存或堆内存。

http://www.artima.com/insidejvm/ed2/jvm2.html说:线程的 Java 堆栈存储线程的 Java(非 native )方法调用的状态。 Java 方法调用的状态包括它的局部变量、调用它的参数、它的返回值(如果有)和中间计算。

所以我认为,JVM 不会将堆中的对象复制到 CPU 缓存中。如果这是正确的,堆中的对象将不会有可见性问题,因为线程只是引用堆中的对象。

顺便说一句假设一个线程调用.add()时出现并发问题。在正常过程中,更改必须用锁来守护,所以这个问题不是问题。但我只想知道:)

最佳答案

答案是“不,其他线程不一定看到对集合的更改”,因为(大部分)标准集合不是线程安全的——也就是说,它们不安全发布他们的状态。 (其他线程可能会也可能不会看到更改)。

这就是为什么 java.util.concurrent package已创建 - 它提供了 java.util.Collections 的线程安全实现。

关于java - 混淆java线程变量可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6742140/

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