【发布时间】:2021-10-05 03:15:37
【问题描述】:
在多线程环境中,锁定线程敏感资源很重要。我经常假设集合等是线程不安全的,这取决于 MS 文档,但简单类型也是线程敏感的吗?
让我们举个例子。锁定int属性访问是否有用,例如
public int SomeProperty
{
get
{
lock (_lock)
{
return _value;
}
}
}
或者是一个普通的吸气剂就足够了,即
public int SomeProperty => _value;
据我了解,简单的字段读取是线程安全的,但我仍然在网络和某些代码存储库中看到第一个示例。
第二个问题,单行指令中的值是顺序读取还是同时读取?换句话说,我这样做时是否需要锁定
public TimeSpan GetSomeExampleValue()
{
lock (_lock)
{
return _dateTime1 - _dateTime2;
}
}
或者我可以简单地做吗
public TimeSpan GetSomeExampleValue()
{
return _dateTime1 - _dateTime2;
}
【问题讨论】:
-
对于最后一个例子,我将如何做取决于预期的用途。也就是说:
_dateTime1和_dateTime2的更改是否会比GetSomeExamplValue的调用更频繁,反之亦然?背景:有很多线程,您可能希望尽量减少冲突。 -
这篇文章可能会让你感兴趣:ericlippert.com/2014/03/12/…
-
几年前 MSDN 杂志上有一系列优秀的文章解决了这些问题。现在有点老了(从 2012 年开始),但仍然值得阅读:docs.microsoft.com/en-us/archive/msdn-magazine/2012/december/…
-
@Shay 似乎可以通过更系统地学习多线程来受益。这是一个有价值的在线资源:Threading in C#,作者 Joseph Albahari。您还可以购买纸质书。
标签: c# multithreading thread-safety locking thread-synchronization