单例和多线程

2023-11-21

我有以下课程

class Singleton
{
  private:

    static Singleton *p_inst;
    Singleton();

  public:

    static Singleton * instance()
    {
      if (!p_inst)
      {
        p_inst = new Singleton();
      }

      return p_inst;
    }
};

请详细说明在多线程环境下实现Singleton时的注意事项。


在多线程中该子句

if(!p_inst)
{
    p_inst = new Singleton();
}

实际上是3个独立的动作。你得到的价值是p_inst,设置值p_inst并写出值p_inst。所以 get-set-write 意味着你需要加锁p_inst否则你可以有 2 个线程来创建一个Singleton每个线程使用的值。

以下是您查看问题的方式,假设您的Singleton有一个可变字段val:

thread A -> p_inst is NULL
    thread B -> p_inst is NULL
       thread A -> set to Singleton (1)
           thread B -> set to Singleton (2)
              thread C -> p_inst is Singleton (2)
                  thread A -> set val to 4
                      thread B -> set val to 6
                         thread C -> get val (it's 6)
                             thread A -> get val (it's 4!!)

你看?有 2 个 Singleton 副本在浮动,其中两个副本都不知道另一个副本。第三个线程检查Singleton只会看到最后一个作业。但通过锁定,您可以防止多重分配和此类问题。

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

单例和多线程 的相关文章

随机推荐

  • 来自 ElementUI 的 VueJs + Webpack 延迟加载模块

    我想在 Vue 组件中延迟加载 ElementUI 的特定元素 我试过这个 import Tree from webpackChunkName element ui element ui Vue component Tree name Tr
  • 如何在不使用 npm 的情况下安装 Node.js 模块?

    列出了相当多的模块在节点的 github 页面上但未通过 npm registry 发布 这些模块无法使用 npm 安装 从 Git 克隆这些 Nodejs 模块后 安装它们的正确方法是什么 您需要从 github 下载它们的源代码 找到主
  • Java 无法比较的数据类型 char 和 String

    当我运行 Javac 时 它告诉我 我有一个无法比较的数据类型 char 和 String while responseChar y 不确定要更改什么来修复此错误 import java util Scanner public class
  • 如何在 mule 中强制例外[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我用的是3 2版本 当肥皂故障从服务返回时 我想记录错误并强制全局异常 我尝试使用
  • PHP 动态命名空间

    我需要能够做到这一点 ns common components cfoBi i18n countryCode gimmea use USP 显然这行不通 那么我该怎么做呢 有 动态命名空间 吗 不可能 命名空间 导入和别名在编译时解析 但是
  • Canvas:遮盖图像并保留其 Alpha 通道?

    这就是我想做的 获取图像 A 和图像 B 图像 B 是黑白掩模图像 将图像 A 的 Alpha 通道替换为图像 B 的红色通道 在画布上绘制图像 C 在图像 C 上绘制图像 A 在步骤 4 之前 一切似乎都正常 图像 C 根本不可见 而图像
  • 使用目录版本和 kotlin dsl 时未找到 LibraryExtension

    我在 gradle 中使用目录版本时遇到问题 我正在尝试将其应用到我的项目中 我从这里举了一个例子https github com android nowinandroid但是当我收到如下错误时 Extension of type Libr
  • Objective-C 中的 Sscanf 等效项

    我目前正在用 Objective C 编写一个 wavefront OBJ 加载器 并试图弄清楚如何以与 C 中的 sscanf 函数类似的方式解析 NSString 中的数据 OBJ 文件以 x y z 三元组的顶点 纹理坐标和法线定义面
  • 如何让脚本在不破坏 CSP 的情况下使用 setAttribute 'style'

    我正在努力使我的 CSP 政策尽可能严格 我需要在我的捆绑包中包含 3d 派对组件 但它使用element setAttribute style 破坏CSP的方法 有没有办法允许这个特定的脚本以这种方式内联样式 是的 有办法 这里有很多关于
  • 如何将外部项目中的控制器和视图包含到 MVC6 中?

    我有一些带有控制器和视图的模块 它基本上是我的网络应用程序的扩展 每个模块都在一个类库中 我想从我的 Web 应用程序加载这些程序集 但我在这里运气不好 我的解决方案文件结构如下 src Web Common Class Library P
  • NSFetchedResultsController 返回重复项(相同的 objectID 和引用)

    我在 NSFetchedResultsController 中遇到了奇怪的行为 这是 iOS 10 中的新功能 开门见山 fetchedObjects包含重复的对象 按照我自己的标准 这绝不是 重复 它们实际上具有相同的 objectID
  • Dagger 在模块上找不到可注入成员

    我在用着Dagger用于 Android 项目中的依赖注入 并且可以很好地编译和构建应用程序 对象图似乎是正确且有效的 但是当我添加 dagger compiler 作为依赖项以在编译时获取错误时 它会报告一些奇怪的错误 ERROR err
  • Dot 不支持新安装的 Graphviz 中的任何格式

    我已经使用推荐的过程在 Fedora 上安装了 Graphviz描述在 GraphViz 官方网站 但是 我无法转换基本的hello dot文件使用dot命令 我的 hello dot 文件是 graph hello Node1 label
  • 在 playframework 中自定义文件更改时重新加载应用程序

    在play框架中有自动重新加载功能 这意味着在开发模式下 每个请求都会检查文件的更改 并在必要时重新编译和重新加载项目 所以 举例来说 如果我 touch conf routes 项目将在下次请求时重新加载 我想添加一些自定义文件来监视 我
  • 币安 API Hmac 签名

    请帮助我不知道我的代码有什么问题 不需要签名的端点工作正常 所以我想我如何获取签名有问题 我收到此错误 data code 2014 msg API key format invalid API文档 https github com bin
  • 将文件从 Google Cloud Container Builder 传递到 Docker 构建任务

    Context 使用 Container Builder 构建的用于 App Engine 的 Ruby on Rails 应用程序 我们要求捆绑器能够使用 SSH 密钥从私有 git 存储库安装依赖项 SSH 密钥来自安全存储桶 并通过
  • 为什么我们总是在 Android/Java 中输入强制类型转换?

    我正在编写一个 Android 应用程序 只是很好奇为什么我们必须始终在 Android 中进行类型转换 我知道我们需要确定类型 以便我们的代码正常运行 但是也许还有其他原因吗 Example public class Navigation
  • Scala 方式处理 for 理解中的条件?

    我正在尝试创建一个简洁的结构 以理解基于 future 的业务逻辑 这是一个示例 其中包含基于异常处理的工作示例 for find the user by id findUser id returns Future Option User
  • 如何在节点集上使用“翻译”Xpath 函数

    我有一个 XML 文档 其中包含我想要删除的带破折号的项目 e g
  • 单例和多线程

    我有以下课程 class Singleton private static Singleton p inst Singleton public static Singleton instance if p inst p inst new S