没有final修饰符的按需初始化持有者惯用语线程安全吗

2023-11-24

我有预感,使用holder 习惯用法而不将holder 字段声明为final 不是线程安全的(由于Java 中不变性的工作方式)。有人可以证实这一点吗(希望有一些消息来源)?

public class Something {
    private long answer = 1;

    private Something() {
         answer += 10;
         answer += 10;
    }

    public int getAnswer() {
      return answer;
    }

    private static class LazyHolder {
        // notice no final
        private static Something INSTANCE = new Something();
    }

    public static Something getInstance() {
        return LazyHolder.INSTANCE;
    }

}

编辑:我绝对想要来源声明,而不仅仅是像“它有效”这样的断言——请解释/证明它是安全的

EDIT2:稍作修改以使我的观点更清楚 - 我可以确定 getAnswer() 方法将返回 21 无论调用线程如何?


The 类初始化过程保证如果使用静态初始值设定项设置静态字段的值(即static variable = someValue;)该值对所有线程都可见:

10 - 如果初始化程序的执行正常完成,则获取 LC,将 C 的 Class 对象标记为完全初始化,通知所有等待线程,释放 LC,并正常完成此过程。


关于您的编辑,让我们想象一下有两个线程 T1 和 T2 的情况,从挂钟的角度按该顺序执行:

  • T1: Something s = Something.getInstance();
  • T2: Something s = Something.getInstance(); i = s.getAnswer();

那么你有:

  • T1 获取 LC,T1 运行Something INSTANCE = new Something();,它初始化answer, T1释放LC
  • T2 尝试获取 LC,但已被 T1 锁定 => 等待。当T1释放LC时,T2获取LC,读取INSTANCE然后读answer.

所以你可以看到你在写入和读取之间有一个正确的happens-before关系answer, 感谢LC lock.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

没有final修饰符的按需初始化持有者惯用语线程安全吗 的相关文章

随机推荐

  • 使用 iOS 7 API 的 UICollectionView 交互式布局转换

    我正在尝试掌握新的 iOS 7 API 这些 API 允许交互式 动画视图控制器转换 包括之间的转换UICollectionViewLayouts 我从 WWDC 2013 iOS CollectionViewTransition 中获取并
  • 检查 jquery 中的值是 float 还是 int

    我有以下 html 字段 我需要检查输入值是 float 还是 int p class check int float type text p document ready function check int float focusout
  • 我如何需要 mysql 字段?

    我刚刚发现 NOT NULL 并不需要字段 创建mysql表时 如何创建不能包含null或空白 里面必须有东西 的字段 默认情况下 MySQL 接受无效值 您可以将 MySQL 设置为严格模式以强制使用有效值 这将拒绝不为 NOT NULL
  • Hive QL - 限制每个项目的行数

    如果我在 where 子句中列出了多个项目 如何将列表中每一项的结果限制为 N EX select a id b c count as sumrequests from table name where a id in 1 2 3 grou
  • 如何在 Yocto 设置中启用eglfs 插件?使用 yocto+meta-qt5 进行 Riotboard

    最近我只是使用 fsl community bsp 和 meta qt5 层来生成交叉工具链和 rootfs 我使用 bitbake meta toolchain qt5 和 bitbake fsl image multimedia ful
  • 数据表日期排序 dd/mm/yyyy 问题

    我正在使用一个名为的 Jquery 插件数据表 太棒了 但是我无法根据 dd mm yyyy 格式正确排序日期 我查看了他们的支持格式 但这些修复似乎都不起作用 这里有人可以帮助我吗 2020 更新 HTML 解决方案 由于 HTML 5
  • 为什么 2.__add__(3) 在 Python 中不起作用?

    整数2 has an add method gt gt gt add in dir 2 True 但是调用它会引发语法错误 gt gt gt 2 add 3 File
  • 在 Redis 中存储嵌套的 javascript 对象 - NodeJS

    我最近在nodejs中从memcached切换到redis 我喜欢 node memcached 的一点是我可以将整个 javascript 对象保存在内存中 遗憾的是我无法在 redis 中做到这一点 例如 我得到以下对象 var obj
  • 尝试使用 java.exe -jar 运行我的 jar 时出现 NoClassDefFoundError...出了什么问题?

    我有一个应用程序 我正在尝试将其包装到 jar 中以便于部署 当作为一组可从 CLASSPATH 访问的类运行时 应用程序可以编译并正常运行 在 Windows cmd 窗口中 但是当我打包我的类并尝试在同一个 cmd 窗口中使用 java
  • 创建自己的 BibTeX 样式还是自定义现有样式?

    我正在寻找一种方法来定义新的BibTeX样式或自定义现有样式 我这样做有两个原因 我希望作者姓名 编辑为斜体 对于书籍 书籍 杂志 百科全书等中的文章 我想要开头的数字 Example 名字 B 书名 地点年份 站点编号 文章作者 A 文章
  • 单击按钮时单元格如何滑动

    我想在单击按钮时滑动单元格 我成功刷了手机 但我想滑动单元格中的按钮 我的代码是 NSArray tableView UITableView tableView editActionsForRowAtIndexPath NSIndexPat
  • iOS - 从 HTML 内容创建多页 PDF [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我有一个很长的 html 页面 想将其转换为多页 PDF 文件 我已按照中提供的说明进行
  • 将 NSTextField 绑定到 NSNumber

    我正在尝试使用 NSTextField 进行整数用户输入 文本字段绑定到 NSNumber 属性 在 setter 方法中 我清理输入值 确保它是 int 并在必要时设置该属性 我发送了 willChangeValueForKey 和 di
  • 如果条件不成立则防止违约

    我有一个链接 当有人点击它时 我想在让它工作之前检查一些条件 如果它是false应防止默认操作 pager next a active click function event if a 1 event preventDefault 该链接
  • 核心数据ios9:多字段唯一约束

    我知道核心数据的新功能是独特的约束 所以我决定测试它 我创建了简单的模式 当我为一个字段 例如名字 添加约束时 一切正常 如果我为另一个字段 姓氏 添加约束 核心数据分别为每个字段创建两个不同的约束 我尝试在一行中添加两个以逗号分隔的字段
  • JBehave 在场景期间跨步骤 Give/When/Then 维护数据

    我已经尝试 JBehave 一段时间了 我需要弄清楚是否存在一种方法可以在一个特定场景的运行期间跨步骤维护数据 我的意思是 是否可以在给定 何时 然后的场景中维护状态 数据 而不使用 Step Class 下的任何状态变量 是的 您可以将维
  • 在正则表达式javascript中转义问号

    我认为这是一个简单的问题 我正在尝试使用 JavaScript 中的正则表达式来搜索一个字符串在另一个字符串中的出现 如下所示 var content Hi I like your Apartment Could we schedule a
  • 使用 php 从字符串中查找文件名

    public images portfolio i vis 1 jpg 无论使用 php 的文件名是什么 我如何删除所有路径 看一下basename path public images portfolio i vis 1 jpg name
  • 耶拿从乌龟读取失败

    我刚刚将 jena 库导入到 eclipse 中以处理 rdf s 这是我的第一次尝试 但我无法读取海龟 ttl 文件 我按照以下方式尝试过 import java io import java util import com hp hpl
  • 没有final修饰符的按需初始化持有者惯用语线程安全吗

    我有预感 使用holder 习惯用法而不将holder 字段声明为final 不是线程安全的 由于Java 中不变性的工作方式 有人可以证实这一点吗 希望有一些消息来源 public class Something private long