SyncRoot 模式有什么用?

2024-03-11

我正在阅读一本描述 SyncRoot 模式的 C# 书籍。表明

void doThis()
{
    lock(this){ ... }
}

void doThat()
{
    lock(this){ ... }
}

并与 SyncRoot 模式进行比较:

object syncRoot = new object();

void doThis()
{
    lock(syncRoot ){ ... }
}

void doThat()
{
    lock(syncRoot){ ... }
}

但是,我不太明白这里的区别;似乎在这两种情况下,这两种方法一次只能由一个线程访问。

书中描述了...因为实例的对象也可以用于从外部进行同步访问,并且您无法通过类本身来控制这种情况,因此可以使用 SyncRoot 模式呃? “实例的对象”?

谁能告诉我上面两种方法之间的区别?


如果您希望防止多个线程同时访问一个内部数据结构,则应始终确保您锁定的对象不是公共的。

其背后的原因是公共对象可以被任何人锁定,因此您可能会造成死锁,因为您无法完全控制锁定模式。

这意味着锁定this不是一个选项,因为任何人都可以锁定该对象。同样,你不应该锁定你暴露给外界的东西。

这意味着最好的解决方案是使用内部对象,因此建议只使用Object.

锁定数据结构是您真正需要完全控制的事情,否则您将面临设置死锁场景的风险,这可能会非常难以处理。

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

SyncRoot 模式有什么用? 的相关文章

  • QCombobox 向下箭头图像

    如何更改Qcombobox向下箭头图像 现在我正在使用这个 QSS 代码 但这不起作用 我无法删除向下箭头边框 QComboBox border 0px QComboBox down arrow border 0px background
  • 何时使用 =default 使析构函数默认?

    尽管对构造函数使用 default 对我来说很清楚 即强制编译器在其他构造函数存在时创建默认构造函数 但我仍然无法理解这两种类型的析构函数之间的区别 那些使用 default 的 那些没有显式定义并由编译器自动生成的 我唯一想到的是 gro
  • FileStream 构造函数和默认缓冲区大小

    我们有一个使用 NET 4 用 C 编写的日志记录类 我想添加一个构造函数参数 该参数可以选择设置文件选项 WriteThrough http msdn microsoft com en us library system io fileo
  • 平滑滚动.net 表单

    您好 我正在 net 中使用表单 并且在运行时动态添加大量链接标签 我将这些链接标签添加到面板并将该面板添加到 winform 当链接标签的数量增加时 表单会显示一个自动滚动条 垂直 现在 当我使用自动滚动向下滚动时 表单在滚动时不会更新其
  • 防止 boost::asio::io_context 在空轮询调用时停止

    此代码调用发布的句柄 boost asio io context ioc boost asio post ioc std cout lt lt lol lt lt std endl ioc poll 而这并没有 boost asio io
  • 指向特征矩阵的指针数组

    我在代码中使用 Eigen 的 MatrixXd 矩阵 在某个时刻我需要一个 3D 矩阵 由于 Eigen 没有三维矩阵类型 因为它仅针对线性代数进行了优化 因此我创建了一个 MatrixXd 类型的指针数组 Eigen MatrixXd
  • 从 WebBrowser 控件 C# 获取滚动值

    我试图在 WebBrowser 控件中获取网页的 Y 滚动索引 但无法访问内置滚动条的值 有任何想法吗 对于标准模式下的 IE 使用文档类型 正如你所说 scrollTop是的财产元素 而不是 HtmlDocument htmlDoc th
  • std::forward_as_tuple 将参数传递给 2 个构造函数

    我想传递多个参数以便在函数内构造两个对象 以同样的方式std pair
  • 如何从文本文件读取整数到数组

    这就是我想做的 我对此有些不满 但我希望你能容忍我 这对我来说是一个非常新的概念 1 在我的程序中 我希望创建一个包含 50 个整数的数组来保存来自文件的数据 我的程序必须获取用户的文档文件夹的路径 2 文件的名称为 grades txt
  • 无法在内存位置找到异常源:cudaError_enum

    我正在尝试确定 Microsoft C 异常的来源 test fft exe 中 0x770ab9bc 处的第一次机会异常 Microsoft C 异常 内存位置 0x016cf234 处的 cudaError enum 我的构建环境是 I
  • 是否有相当于 Clang/LLVM 的 .spec 文件,在哪里可以找到参考?

    The gcc驱动程序可以配置为使用特定的链接器 特定的选项和其他细节 例如覆盖系统头 specs files 当前 截至撰写本文时 GCC 版本 4 9 0 的手册此处描述了规范文件 https gcc gnu org onlinedoc
  • ASP.NET MailMessage.BodyEncoding 和 MailMessage.SubjectEncoding 默认值

    很简单的问题 但我在 MSDN 上找不到答案 查找 ASP NET 将用于的默认值 MailMessage BodyEncoding and MailMessage SubjectEncoding 如果你不在代码中设置它们 Thanks F
  • 在 EnvDTE 中调试时捕获 VS 局部变量

    是否可以使用 EnvDTE 进行 vsix Visual Studio 扩展来捕获本地和调试窗口使用的调试数据 或者可以通过其他方法吗 我想创建一个自定义的本地窗口 我们可以修改它以根据需要显示一些较重的内容 而无需为高级用户牺牲原始的本地
  • .NET Core 中的跨平台文件名处理

    如何处理文件名System IO以跨平台方式运行类以使其在 Windows 和 Linux 上运行 例如 我编写的代码在 Windows 上完美运行 但它不会在 Ubuntu Linux 上创建文件 var tempFilename Dat
  • 使用restsharp序列化对象并将其传递给WebApi而不是序列化列表

    我有一个看起来像的视图模型 public class StoreItemViewModel public Guid ItemId get set public List
  • 终结器线程的范围是什么 - 每个应用程序域或每个进程?

    根据我的所有阅读 应该有一个 GC 线程来调用所有终结器 现在的问题是这个 一个 线程的范围是什么 每个进程或每个应用程序域 因为域的整体目的是在一个进程空间中分离并创建 独立 的不同应用程序 I read here http dn cod
  • 使用taskkill停止Windows服务

    我需要帮助来使用 C 终止 Windows 服务 现在要终止该服务 请使用以下选项 从命令 sc queryex ServiceName 发现后PID服务的 taskkill pid 1234 exemple f 为了便于阅读 但如果您明白
  • Log4j2 ThreadContext 映射不适用于parallelStream()

    我有以下示例代码 public class Test static System setProperty isThreadContextMapInheritable true private static final Logger LOGG
  • C++ Streambuf 方法可以抛出异常吗?

    我正在尝试找到一种方法来获取读取或写入流的字符数 即使存在错误并且读 写结束时间较短 该方法也是可靠的 我正在做这样的事情 return stream rdbuf gt sputn buffer buffer size 但如果streamb
  • C++0x中disable_if在哪里?

    Boost 两者都有enable if and disable if 但 C 0x 似乎缺少后者 为什么它被排除在外 C 0x 中是否有元编程工具允许我构建disable if按照enable if 哦 我刚刚注意到std enable i

随机推荐

  • C# 如何判断 DVD 驱动器托盘是否打开?

    我有一个用 C 编写的 DVD 读取和刻录应用程序 我希望能够检测空驱动器 无磁盘 和打开驱动器之间的区别 编辑 经过更多谷歌搜索后 我认为更好的问题描述是 我想访问驱动器托盘状态 打开或关闭 我可以用 ManagementObjectSe
  • ASP.NET MVC5/IIS Express 无法调试 - 代码未运行

    我启动 VS2013 VB Net MVC5 Web 应用程序 在 HomeController About 方法中设置断点并运行 开始调试 导航到 About 页面并接收消息 Code not running The current Th
  • gnu make“删除中间文件”

    我有以下规则 define compile c ECHO CC lt Q CC CFLAGS c MD o lt The following fixes the dependency file See http make paulandle
  • 从原始数据的字节数组中获取缓冲图像

    我正在使用JNA 我从我的 C 方法中获取原始数据的字节数组 现在我陷入了如何使用这个原始数据字节数组在java中获取缓冲图像的困境 我尝试了一些方法来使其成为 tiff 图像 但我没有取得成功 这是我到目前为止尝试过的代码 这里我的字节数
  • 将子视图延迟加载到非分页 UIScrollView 中

    我正在尝试实现一个类似幻灯片的 UIScrollView 它将填充目录页面的缩略图 选择缩略图将导致主 UIScrollView 移动到所选页面 目录可能包含 100 200 页 我只想在需要时才延迟加载它们 我已经在启用分页的 UIScr
  • 创建用于 XML 导出的多维对象

    我正在导入一个包含大量发票数据的 csv 文件 该数据需要根据供应商 ID 分组在一起 以显示每个供应商的标题以及该供应商 ID 的所有发票的总和 然后在其下方显示每张单独的发票 该项目的目标是导入 CSV 向用户显示数据 允许通过选择框更
  • Javascript 在选中的复选框上克隆此 div,在未选中的情况下删除此 div

    选中该复选框后 克隆正确的 div 并将其显示在示例中 div div 当取消选中该复选框时 删除克隆 并伴随localStorage 有人可以帮我解决这个问题吗 function onClickAvGamesCheckBox var ar
  • 使用 Blobstore API 和 Images API 直接从 GAE 中的 GCS 提供图像

    关于 Blobstore 和 Google Cloud Storage GCS 的许多问题和答案已有两三年历史 而这些年情况发生了巨大变化 GCS 不再是一项独立的服务 这是融合的 https developers google com s
  • ShortDynamicLink 不生成动态链接的短链接

    创建动态链接 DynamicLink dynamicLink FirebaseDynamicLinks getInstance createDynamicLink setLink Uri parse http shaharapp in se
  • 为什么java.lang.Object中的finalize()方法是“受保护的”?

    出于好奇 为什么是finalize 方法的访问修饰符被设为protected 为什么不能是public 有人可以向我解释一下这背后的具体原因吗 另外 我也了解到finalize 方法仅被调用一次 如果我在程序内部调用它两次 会发生什么 垃圾
  • Apple 是否为 SIRI 提供 API?

    Apple 是否有可能为 Siri 提供 API 如果我可以一边喝着咖啡一边说 User 嘿 Siri 你能打开愤怒吗 鸟类 4 级并为我扔第一只鸟 确保你至少打到一只绿猪 否则它就会从你的薪水中扣除 Siri 是的 当然 我会为你做的 这
  • Visual Studio Code,如何复制文件名

    在 Visual Studio 代码中 它有以下命令Copy Path and Copy Relative Path Ctrl Shift p gt 文件 复制活动文件的路径 有没有办法可以复制活动文件名而不是整个路径 如果没有办法复制活动
  • 更改 Julia 中的包目录

    我想更改 Julia 中的包目录 默认为 julia v0 4 我想要move it to opt julia v0 4 理想情况下 我想移动已安装的软件包 julia v0 4到新地点 但如果这是不可能的 我可以重新安装它们 我需要做什么
  • 如何使用 lambda 获取列表中过滤项的索引?

    我有一份水果清单 name apple qty 233 name orange qty 441 当我过滤列表时orange使用拉姆达 list filter lambda x x name orange fruits 我得到了正确的字典 但
  • AsynchronousByteChannel 的线程含义

    Javadoc 的AsynchronousByteChannel read http download oracle com javase 7 docs api java nio channels AsynchronousByteChann
  • “尝试读取或写入受保护的内存。”将项目添加到列表<>时

    偶然发现奇怪的错误 一些研究表明 当您篡改代码内存时 就会出现这种错误 我不做这样的事 完整错误 Cineman ni DLL 中发生 System AccessViolationException 类型的未处理异常 附加信息 尝试读取或写
  • 添加超过 8 个项目时,AEM ACS Commons 通用列表编辑器会中断

    ACS 共享版本 5 0 6AEM 版本 6 5 8 0 我试图通过单击缩略图 然后单击顶部操作栏中的 属性 来编辑 http localhost 4502 generic lists html etc acs commons lists
  • 绘制点而不是线? JFreeChart PolarChart

    目前 PolarChart 将所有坐标与线条连接起来创建多边形 我只是希望它用点绘制每个点而不是将它们连接在一起 这可能吗 我尝试过使用translateValueThetaRadiusToJava2D 和 Graphics2D 来绘制圆圈
  • Android Studio:重新下载依赖项并同步项目

    我下载了一个开源游戏 ChaseWhisply项目 https github com tvbarthel ChaseWhisplyProject 源代码来自Github 我在 Android Studio 版本 1 5 1 中导入了该项目
  • SyncRoot 模式有什么用?

    我正在阅读一本描述 SyncRoot 模式的 C 书籍 表明 void doThis lock this void doThat lock this 并与 SyncRoot 模式进行比较 object syncRoot new object