引用分配是线程安全的吗?

2024-02-12

我正在 C# 中构建一个多线程缓存,它将保存 Car 对象的列表:

public static IList<Car> Cars {get; private set;}

我想知道在不锁定的情况下更改线程中的引用是否安全?

e.g.

private static void Loop()
{
  while (true)
  {
    Cars = GetFreshListFromServer();
    Thread.Sleep(SomeInterval);
  }
}

基本上,我猜这取决于为 Cars 分配新的引用是否是原子的。

如果不是,我显然必须为我的汽车使用私人领域,并锁定获取和设置。


是的,参考更新在语言规范中保证是原子的。

5.5 变量引用的原子性

以下数据类型的读取和写入是原子的:bool、char、byte、sbyte、short、ushort、uint、int、float 和引用类型。此外,对具有前面列表中的基础类型的枚举类型的读取和写入也是原子的。其他类型(包括 long、ulong、double 和decimal)以及用户定义类型的读取和写入不保证是原子的。

然而在一个紧密的循环中你might被寄存器缓存所困扰。在这种情况下不太可能,除非您的方法调用是内联的(这可能会发生)。我个人会添加lock使其变得简单且可预测,但是volatile也可以在这里提供帮助。请注意,完整的线程安全不仅仅是原子性。

在缓存的情况下,我会查看Interlocked.CompareExchange,个人 - 即try更新,但如果失败重做工作从头开始(从新值开始)并重试。

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

引用分配是线程安全的吗? 的相关文章

随机推荐

  • Google Analytics gtag.js 手动将链接器跨域参数添加到 URL

    对于 Google Analytics 分析 的 gtag js 实现 希望手动将链接器参数添加到特定 URL 以便 ga 参数出现在单击的 URL 上 但文档似乎位于https developers google com analytic
  • MFMailComposeViewController 将签名附加为 .txt 文件

    我正在通过 MFMailComposeViewController 发送 pdf 在 Outlook 中查看时 发件人的签名被视为附件 但在 iOS 本机邮件应用程序中则不然 其他一切都按预期工作 签名显示附件的原因是什么 IBAction
  • 限制事件监听器每秒可以触发的次数

    我正在使用 Gamepad API 特别是使用控制器上的操纵杆的轴 这些位置的更新很多而且经常 因此 我正在监听的事件 棍子上的运动 也经常发生 有什么方法可以将其发生次数限制为每秒 25 次 以减少延迟吗 您无法限制 JavaScript
  • 如何用文本+图像动态填充Android Spinner

    这就是我想要实现的目标我能够实现这么多 我能够将文本和图像添加到微调器中 但图像没有显示在文本旁边的下拉菜单中 它仅针对微调器的选定项目显示 这是我的代码 spinner layout xml包含主微调器的布局
  • Slickgrid 复选框和过滤问题

    我有一个填充有数据的 slickGrid 并通过以下方式添加了第一个复选框列 if info includeSelectCheckbox var checkboxSelector new Slick CheckboxSelectColumn
  • Tkinter Checkbutton 和事件回调函数

    这是我在 Effbot 网站上找到的一个小代码示例 它与我想要在我的一个程序中执行的操作很接近 from Tkinter import fen Tk class test Tk class def init self self var In
  • BigDecimal 的 StringBuilder 的模拟

    我有一个 BigDecimals 列表需要求和 如果它们是要连接的字符串 我会使用 StringBuilder 来减少对象创建 BigDecimal 有类似的东西吗 或者也许我不应该为此烦恼 BigDecimal 创建的优化值得花精力吗 B
  • pgadmin4 无法在 nginx 后面的特定位置工作

    我遇到了一些麻烦 pgadmin 在位置 中的 nginx 后面工作完美 但它不会在位置 pgadmin 后面工作 工作很棒 location proxy http version 1 1 proxy set header X Real I
  • 计算小距离用什么公式

    Hy 我需要计算 2 个 GPS 点之间的距离 我读了这个问题计算地理邻近度的公式 https stackoverflow com questions 2096385 formulas to calculate geo proximity但
  • 更改 MouseOver 上的 MenuItem 的颜色

    我想在鼠标悬停时更改菜单项的颜色 我还需要圆形边框 图像和文本框 当我设置样式时 一切正常 只有 mouseOverEvent 正在执行任何操作 背景不会改变 我的代码是
  • 绕圆形路径移动一个点[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个带有二维坐标的点 我需要更改点坐标值才能遵循圆形路径 我将如何使用 C 实现它 使用正弦和余弦 for double t 0
  • 有没有办法让字典作为 python 中 pandas Dataframe 的条目?

    就像是 d a 1 b 2 data pandas DataFrame data new column d data new column 0 最后一个命令将返回字典 d 您可以将字典包装在列表中 以便将字典视为元素而不是可迭代对象 d a
  • C++ 向量元素计数

    在C 中 使用向量头 如何找到元素的数量 include
  • 是否可以修复长 html huxtable 的头部?

    这适用于使用以下命令生成的表kableExtra这在检查长桌子时很有用 我想知道是否有人知道如何做到这一点huxtable 这是一个示例 Rmd 以了解我的意思 我希望在向下滚动时将 huxtable 标题固定在页面顶部 就像在 kable
  • 短路和一元运算符的工作

    请看一下下面的代码 int i 5 boolean b i lt 5 i lt 5 line 2 System out println i line 3 prints 5 在第2行 根据我的理解 因为在所有运算符中 具有最高优先级 i应首先
  • C++ 中的内存管理模式

    我认为我对正常 功能 设计模式有丰富的经验 例如所描述的在四人帮的书 http www amazon co uk Design patterns elements reusable object oriented dp 0201633612
  • 一段时间后重新连接到 QueueManager 时,在 MQ 客户端 (C#) 上收到错误原因代码 2059

    一段时间后我无法重新连接到 MQQueueManager 作为异常 原因代码2059 当我构造 MQQueueManager 的新对象时 抛出 MQRC Q MGR NOT AVAILABLE 我的客户端应用程序是用 NET C 编写的 我
  • FirstOrDefault 行为直接在 LINQ 语句中

    似乎我可能错过了语法中的一些简单内容 但我想直接从 linq 语句获取 FirstOrDefault 的结果 而不必先将 IEnumerable 存储在临时变量中 像这样的事情 var bestCar from c in cars orde
  • 如何制作类型提示前向引用[重复]

    这个问题在这里已经有答案了 我正在研究 python 的 3 5 类型提示 我想知道如何键入提示类方法的返回类型 这就是我的想法 gt gt gt class A classmethod def a cls gt A pass Traceb
  • 引用分配是线程安全的吗?

    我正在 C 中构建一个多线程缓存 它将保存 Car 对象的列表 public static IList