当前位置: 首页 > 知识库问答 >
问题:

volatile引用真的保证对象的内部状态对其他线程可见吗?

卢宜然
2023-03-14
    null

我的问题是--第二点是真的吗?即。我可以仅仅通过在易失性引用中存储对对象的引用来使它的状态对其他线程可见吗?如果不是,我是不是读错了上面的几点?

共有1个答案

邹丰羽
2023-03-14

使object volatile不会使其状态发布到所有线程,即

volatile A a = new A();
private static class A {
    int i = 0;
    int j = 0;
    int k = 0;
}

不等于

A a = new A();
private static class A {
    volatile int i = 0;
    volatile int j = 0;
    volatile int k = 0;
}

(1)相反,使您的引用易变,即如果一个线程重新分配引用,这个重新分配将立即“发布”给其他线程

 类似资料:
  • 下面的代码片段使用多个线程,使用AtomicInteger计算到1亿。我有10个Writer线程来模拟写争用,还有一个Reader线程来模拟读争用。作者和读者还共享一个易变的布尔变量作为毒药。 但是,只有读线程可以退出,而写线程不能退出。尽管将变量声明为volatile,但为什么读线程不能看到更新的值? 附言:如果我把布尔值包在一个对象中,它就会工作。

  • 问题内容: 如果知道与该线程关联的ID,该如何获取正在运行的线程的引用? 例如 问题答案: 您有2种方法可以做到。两者都很简单: 旧方法:获取您可以循环访问..getParent()的根线程组。并打电话 较新(但速度较慢)。 第一种方法有一个小问题,由于存在错误,ThreadGroup可能根本无法枚举任何东西。 第二个比较慢,但是有安全漏洞。

  • 类OneValueCache是不可变的。但是我们可以更改变量缓存的引用。 但我不能理解为什么VolateCachedFactorizer类是线程安全的。 对于两个线程(线程A和线程B),如果线程A和线程B同时到达,那么两个线程A和B都将尝试创建OnEvalueCache。然后线程A到达而线程B同时到达。然后线程A将创建一个,它覆盖threadB创建的值(OneValueChange是不可变的,但是

  • 问题内容: 我从javascript对象内部进行了一些Ajax调用。 在onreadystatechange函数内部,它不再引用主对象,因此我无法访问this.foo。我如何在XMLHttpRequest事件中保留对主对象的引用? 问题答案: 最简单的方法通常是将的值存储在局部变量中: 我也怀疑您的标识符确实是构造函数(您正在分配属性)。 如果是这种情况,请不要忘记添加正确的属性(因为您正在替换整

  • 从静态初始值设定项初始化对象引用 将对它的引用存储到volatile字段或atomicreference 将对它的引用存储到正确构造的对象的最后一个字段 将对它的引用存储到由锁正确保护的字段中。 但是,我对第二个成语感到困惑。因为只能保证引用对另一个线程是可见的,但它没有它所引用的对象构造的同步。那么它如何保证可变对象是正确构造的,构造这个对象的线程是什么,被另一个线程打断了呢?

  • 我有一个通过JNI调用C++共享对象的Java对象。在C++中,我保存了对JNIEnv和JObject的引用。 我还有一个GLSurface呈现器,它最终在一个不同的线程glthread上调用上面提到的C++共享对象。然后,我试图使用我最初保存的jobject回调到我最初的Java对象,但我想,因为我在GLThread上,我得到了以下错误。 回Java的代码: } 如果我使用env->newobj