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

Java volatile语义、JMM保证

洪英豪
2023-03-14
public class Visibility {

    private volatile SomeData data;

    public static class SomeData {

        private int number;

        public SomeData(int number) {
            this.number = number;
        }

        public int getNumber() {
            return number;
        }
    }

    public void initialize() {
        data = new SomeData(42);
    }

    public SomeData getData() {
        return data;
    }
}

我们对非最终场有同样的保证吗?换句话说,某些线程是否可能观察到非空的data引用,但number字段为0

提前道谢!

共有1个答案

申屠泳
2023-03-14

某些线程不可能观察到非NULL数据引用,而是number字段为0。

参见volatile的文档:

这意味着对volatile变量的更改对其他线程总是可见的。此外,这还意味着当线程读取volatile变量时,它不仅会看到volatile的最新更改,还会看到导致更改的代码的副作用。

 类似资料:
  • 主要内容:概念,特性,主内存与工作内存,指令重排序的条件,happens-before 原则,jvm和jmm之间的关系,CAS概念 Java内存模型(Java Memory Model,JMM)JMM主要是为了规定了线程和内存之间的一些关系。根据JMM的设计,系统存在一个主内存(Main Memory),Java中所有变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(Working Memory),工作内存中保存的是主存中某些变量的拷贝,线程对所有变量的操作都是在工作内存中

  • 本文向大家介绍Java内存模型JMM详解,包括了Java内存模型JMM详解的使用技巧和注意事项,需要的朋友参考一下 Java Memory Model简称JMM, 是一系列的Java虚拟机平台对开发者提供的多线程环境下的内存可见性、是否可以重排序等问题的无关具体平台的统一的保证。(可能在术语上与Java运行时内存分布有歧义,后者指堆、方法区、线程栈等内存区域)。 并发编程有多种风格,除了CSP(通

  • 本文档主要介绍WebAssembly代码的高级设计:类型,结构和语义。WebAssembly代码可以被认为是一个结构化堆栈机器; 大多数计算仅使用栈中存储的数值内容,但是控制流使用结构化构造表示,如区块,条件判断ifs 和循环等。 实践中, 具体实现无须为控制流维护实际值栈和数据结构;它们只须遵循as if规则 。 全部详情请参阅the formal Specification, 想要了解文件级编

  • 本文向大家介绍学习Java内存模型JMM心得,包括了学习Java内存模型JMM心得的使用技巧和注意事项,需要的朋友参考一下 有时候编译器、处理器的优化会导致runtime与我们设想的不一样,为此Java对编译器和处理器做了一些限制,JAVA内存模型(JMM)将这些抽象出来,这样编写代码时就无需考虑那么多底层细节,并保证“只要遵循JMM的规则编写程序,其运行结果一定是正确的”。 JMM的抽象结构 在

  • 译者:片刻 torch.cuda 用于设置和运行 CUDA 操作。它会跟踪当前选定的GPU,并且默认情况下会在该设备上创建您分配的所有 CUDA tensors。可以使用 torch.cuda.device 上下文管理器更改所选设备。 但是,一旦分配了 tensor,就可以对其进行操作而不管所选择的设备如何,结果将始终与 tensor 放在同一设备上。 默认情况下不允许跨 GPU 操作,除了 co

  • torch.cuda会记录当前选择的GPU,并且分配的所有CUDA张量将在上面创建。可以使用torch.cuda.device上下文管理器更改所选设备。 但是,一旦张量被分配,您可以直接对其进行操作,而不考虑所选择的设备,结果将始终放在与张量相同的设备上。 默认情况下,不支持跨GPU操作,唯一的例外是copy_()。 除非启用对等存储器访问,否则对分布不同设备上的张量任何启动操作的尝试都将会引发错