为什么要使用双重检查锁定?

2024-01-27

我继续运行使用双重检查锁定的代码,但我仍然对为什么使用它感到困惑。

我一开始并不知道双重检查锁定被破坏 http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html,当我了解到它时,它为我放大了这个问题:人们为什么首先使用它?比较和交换不是更好吗?

if (field == null)
    Interlocked.CompareExchange(ref field, newValue, null);
return field;

(我的问题适用于 C# 和 Java,尽管上面的代码适用于 C#。)

与原子操作相比,双重检查锁定是否具有某种固有的优势?


与原子操作相比,双重检查锁定是否具有某种固有的优势?

(这个答案只涵盖C#;我不知道Java的内存模型是什么样的。)

主要区别在于潜在的种族。如果你有:

if (f == null)
    CompareExchange(ref f, FetchNewValue(), null)

那么 FetchNewValue() 可以在不同线程上任意调用多次。其中一条线程赢得了比赛。如果 FetchNewValue() 非常昂贵,并且您想确保它只被调用一次,那么:

if (f == null)
    lock(whatever)
        if (f == null)
            f = FetchNewValue();

保证 FetchNewValue 仅被调用一次。

如果我个人想要进行低锁延迟初始化,那么我会按照您的建议进行操作:我使用互锁操作并忍受罕见的竞争条件,其中两个线程都运行初始化程序,并且只有一个线程获胜。如果这是不可接受的,那么我使用锁。

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

为什么要使用双重检查锁定? 的相关文章

随机推荐

  • Rails - Rake 错误:库未加载

    我读过几乎所有关于 Rails 错误的文章 寻找解决我的问题的方法 虽然我已经解决了一些问题 但我还想出了更多 我升级到Snow Leopard 并根据 Agile Development with Rails 一书安装了RVM和Rails
  • 不使用排序函数将从数组接收的字符按字母顺序排列?

    所以 基本上 我用 java 创建了一个算法 从字符串中获取字符并计算其频率 现在 我需要按字母顺序打印它 例如 频率 3 d 频率 1 l 频率 5 有什么建议么 这是我到目前为止所拥有的 int charCounts String us
  • Hammer.js 平移事件仅适用于触摸设备,不适用于桌面计算机单击+拖动

    我使用这个标准代码进行平移 捏合 1 使用 Hammer js var mc new Hammer document body mc add new Hammer Pinch threshold 0 recognizeWith mc get
  • MS Access 在两个日期之间选择?

    我已经搜索过 但所有结果都无法帮助我理解 我需要选择 18 23 岁人员的姓名 所以我的尝试是 WHERE People Birth Between Now Year 18 And Now Year 23 我做错了什么 some date
  • 是什么导致 Firefox 在通过 POST 方法提交表单后发出 GET 请求?

    当通过 POST 方法提交表单时 是什么导致 Firefox 在 POST 请求后跟随 GET 请求 GET 方法发送到与 POST 方法相同的 url 但不带请求参数 如果将表单方法更改为 GET 则会产生两个相同的 GET 请求 这是
  • 在 MYSQL Workbench 中声明语法错误

    我如何在我的中声明和设置变量MYSQL WORKBENCH在存储过程中 它给出了一个语法错误 例如unexpected Declare sym在第一行有一个十字符号 我正在使用以下代码 Declare StartDate datetime
  • 如何知道int*数组的结尾?

    我正在制作一个动态数组int 数据类型使用malloc 但问题是 如何知道数组结束呢 没有相当于 0 for int 数据类型 那么 如何做到这一点呢 将大小作为函数的输出参数传递 C 不像其他一些语言那样管理数组长度 你可以考虑一个结构
  • iOS 配置文件未安装在一台特定设备上

    我最近分发了一个用于测试的应用程序 测试团队在安装该应用程序时遇到了问题 更具体地说是与该应用程序关联的配置文件 他们使用的是 iPhone 4 iOS 5 1 1 并收到 由于未知错误而无法安装配置文件 我习惯于在尝试安装的配置文件中未注
  • Java 8:为什么我无法将此二进制字符串解析为 long?

    长话短说 我正在用 Java 搞一些基本的遗传算法 我当时用的是long存储我的基因 但我在调试时使用二进制字符串以提高可读性 我遇到了一个奇怪的情况 我无法解析一些以 a 开头的二进制字符串1 我不知道是否总是如此 但似乎与长度为 64
  • 引导程序中的填充

    我使用引导程序 div class container div class row div class span6 h2 Welcome h2 p Hello and welcome to my website p div div clas
  • 我正在尝试使用 JDBC 从 Oracle 表中提取 XMLTYPE 列,但遇到一些问题

    我正在尝试使用 JDBC 从 Oracle 表中提取 XMLTYPE 列 我有疑问 select XML FILE FROM TABLE NAME 当我在 Oracle SQL Developer 中运行查询时 它完全正常地返回所有 XML
  • 如何在窗口关闭时设置断点或阻止开发人员工具窗口关闭?

    我在 FireFox 弹出窗口的单独窗口中打开了开发人员工具 问题是 表单提交后 该弹出窗口会由 JavaScript 自动关闭 并且我无法禁用 JavaScript 本身 因为它需要 JavaScript 来提交表单 我搜索了一种在窗口关
  • 如何将 GGRAPH 包安装到最新的 R (v.3.3.2)

    我对 R 非常陌生 我需要 ggraph 库 但无法从 rstudio 控制台安装它 这是一条消息 install packages 中的警告 包 ggraph 不可用 对于 R 版本 3 3 2 还有其他安装方式吗 看起来这个图书馆仍然存
  • 查询拦截 - 处置诊断侦听器

    我们正在使用DiagnosticListeners以便修改 EF Core 生成的 SQL 命令文本 问题是我们的侦听器需要根据通过 HttpRequests 进入我们的 Api 的一些用户特定数据来修改 SQL 命令 我们当前的解决方案非
  • 通用枚举 JPA AttributeConverter 实现

    我试图解决的问题 我正在尝试为 Hibernate 实现枚举映射 到目前为止 我已经研究了可用的选项 并且 Enumerated EnumType ORDINAL and Enumerated EnumType STRING 似乎不足以满足
  • 在两个js文件之间共享全局变量

    我正在使用两个 js 文件并在钛应用程序中在它们之间共享变量 在我的主 app js 中 我有 3 个与表中每一行关联的变量 我有一个事件侦听器 用于单击一行打开模态视图 该视图的组件位于单独的 js 文件中 我的三个变量如下 在单击事件中
  • 检索 id 1 的 Avro 模式时出错,未找到主题。;错误代码:40401

    Caused by org apache kafka common errors SerializationException Error retrieving Avro schema for id 1 Caused by io confl
  • 没有 STB_GNU_UNIQUE 的静态链接 stdc++ 在 dlclose 时导致内存泄漏

    我必须制作一个 dso 静态链接 stdc 并且需要可以从内存动态卸载 所以我尝试编译 gcc disable gnu unique object并使用黄金链接 Wl no gnu unique选项 但两者都包含内存泄漏问题 即使我除了调用
  • Android中的MVC架构[重复]

    这个问题在这里已经有答案了 可能的重复 Android 中的 MVC 模式 https stackoverflow com questions 2925054 mvc pattern in android 我想关注MVC架构 in Andr
  • 为什么要使用双重检查锁定?

    我继续运行使用双重检查锁定的代码 但我仍然对为什么使用它感到困惑 我一开始并不知道双重检查锁定被破坏 http www cs umd edu pugh java memoryModel DoubleCheckedLocking html 当