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

空引用的安全初始化

毋承基
2023-03-14

我想知道初始化为null的非final字段是否存在发布保证。

public class MyClass {

    private final CopyOnWriteArrayList<Inner> list = new CopyOnWriteArrayList<>();

    //called by thread 1
    public void init() {
        // initialise Inner instance
        list.add(new Inner());
    }

    //called by thread 2
    public void doSomething() {
        for (Inner i : list) {
            // access non-final field
            Object ref = i.ref;
            // do something
            // ...
            // ...

            // potentially set i.ref
        }
    }

    private static class Inner {
        // initialised by thread 1
        Object ref = null;
    }
}

共有1个答案

许远航
2023-03-14

JVM将保证您不会凭空看到值,所以除了null以外的任何值都是不可能的,如果list不是空的(当然在本例中)。如果涉及到一个不同的线程(例如Thread3)来更改列表(向其中添加元素),那么Thread2可以看到这些更新。请注意,CopyOnWriteArrayList的各个方法是线程安全的;您的方法doSomething不是。

有关细节,请参见JLS,或者Aleksey的优秀文章(对我来说可能是相当复杂的)。

 类似资料:
  • 问题内容: 我试图基于初始化按需持有人习惯用法创建一个线程安全的单例类。这是我的代码 我的期望是以线程安全的方式初始化ExecutorService,并且那里只有一个实例(静态)。 这段代码是实现了这一目标-还是需要任何更改? 问题答案: 根据SEI 指南,您的方法很好。 但是,由于我们有枚举,因此可以使用枚举的简单方法: 而且,如果您想变得真正聪明,还可以定义枚举实现的接口。因为这样您以后可以

  • 当云联壹云的First Node部署成功后,用户可根据使用场景快速引导配置云联壹云平台。 设置管理员用户 当First Node节点部署完成后,用户在浏览器中输入First Node节点的IP地址,如提示“您的连接不是私密连接”,请单击 “高级” 按钮,并单击“继续前往x.x.x.x(不安全)”,打开云管平台控制台。 在管理员注册页面,设置管理员账号、密码,单击 “注册” 按钮,创建管理员用户。

  • 问题内容: 我试图简单地测试JLS保证的最终字段的初始化安全性。这是我写的论文。但是,根据我当前的代码,我无法使其失败。有人可以告诉我我做错了什么吗,或者这只是我必须一遍又一遍然后看到失败的时机而已? 这是我的代码: 我的线程正在这样调用它: 我已经多次运行过这种情况。我当前的循环产生了10,000个线程,但是我已经完成了1000、100000,甚至一百万个线程。仍然没有失败。我总是看到3和4这两

  • 在这一章,我们将看看怎么创建一个命名空间配置来使用框架的主要功能。让我们假设你想要快速的使用命名空间配置添加验证支持和访问控制和一些测试的登录到一个已经存在的网站应用程序。然后我们看看如何将验证换刀数据库和其他的安全仓库。在后续章节我们将介绍更多高级的命名空间配置选项。 web.xml 配置 你需要做的第一件事情是添加下面的过滤器定义到你的web.xml 文件: <filter> <filter-

  • 我正在写一个测试用例,我需要一些私有属性。由于这些私有数据是从私有方法生成的,所以我决定在计算完成后使用反射来检索它们。后来,我想起了委托的属性,并决定编写一个通用委托。以下是我目前得到的代码: Kthacks.java ReflectBakedProperty.kt

  • 我试图初始化一个< code>constexpr引用,但没有成功。我试过了 但我收到了编译时错误 错误:constexpr变量“z”必须由常量表达式初始化 删除< code>const会导致 错误:将对类型“int”的引用绑定到类型“const int”的值会删除限定符 尽管我感觉< code>constexpr自动暗示变量声明的< code>const。 所以我的问题是: < Li > < co

  • 我得到的是它们是线程安全的。 杰里米·曼森博客的片段- 因为this引用存储在lastconstructed中“,因此转义构造函数 请建议。

  • Git 配置 使用Git的第一件事就是设置你的名字和email,这些就是你在提交commit时的签名。 $ git config --global user.name "Scott Chacon" $ git config --global user.email "schacon@gmail.com" 执行了上面的命令后,会在你的主目录(home directory)建立一个叫 ~/.gitco