【问题标题】:Can define thread safe object as Readonly variable?可以将线程安全对象定义为只读变量吗?
【发布时间】:2016-07-13 05:48:27
【问题描述】:

我可以像下面这样定义 lockObject:

private readonly object lockObject;

或者应该像这样玷污:

private object lockObject;

【问题讨论】:

  • 如果您在初始化后永远不需要写入字段,则将其定义为只读。锁定对象是不应该改变的一个很好的例子。
  • @GlorinOakenfoot 谢谢,但是.net 框架是否需要写入锁定对象?
  • 但是你需要创建对象。通常你会写:private readonly object lockObject = new object();
  • @Fred 否。lock 指令(通常是“实现”lockMonitor.Enter/Monitor.Exit)在连接到object
  • 这里解释说,在 Microsoft .NET 中,lock 在锁定对象前面的一些“隐藏”内存中写入:stackoverflow.com/questions/30690790/clr-sync-block-address

标签: c# multithreading thread-safety


【解决方案1】:

99.99% 的时间使用只读方式

传统上你会想要一个只读对象作为你的锁,原因是锁是在变量lockObject上的对象上完成的,如果你不让它只读并且它改变了,可能会有这样的情况锁被放置在多个线程的不同对象上。

这是一个很好的列表解释,可以在不使用只读锁的情况下导致问题

  1. 线程 A 在 lockObject 处获取锁
  2. 线程 B 更改变量 lockObject
  3. 线程 C 在lockObject 处获取锁,这与步骤 1 中的锁不同

0.01% 的时间

这将是当您出于某种原因想要更改锁定时,即您控制访问的资源已更改,但可能仍有线程在前一个资源上工作,并且您认为它们当前的操作对您的程序仍然有效,而且您不想等待他们更改锁定。 这同样带有警告,您可能不应该这样做

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 2015-08-24
    • 2011-01-24
    • 2014-12-12
    相关资源
    最近更新 更多