我正在阅读Joe的Albahari C# 线程教程:
作者解释了为什么DateTime.Now
需要是线程安全的:
根据微软文档,将对对象的访问封装在自定义锁中只有在所有并发线程都知道并使用该锁时才有效。如果对象的作用域广泛,这可能不是情况。最糟糕的情况是公共类型中的静态成员。例如,想象一下如果DateTime结构体上的静态属性DateTime.Now不是线程安全的,并且两个并发调用可能导致混乱的输出或异常。通过外部加锁来解决这个问题的唯一方法可能是在调用DateTime.Now之前锁定类型本身- lock(typeof(DateTime))。这只有在所有程序员都同意这样做(这是不太可能的)的情况下才有效。此外,锁定类型会产生自己的问题。
因此,DateTime结构体上的静态成员已经被精心编程以实现线程安全。
.NOW
是public static DateTime Now { get; }
,即只读属性。既然是只读属性,为什么还要考虑线程安全呢?两个并发调用应该能够在不干扰彼此的情况下获取当前时间吧?编辑:很多人指出问题不太清楚。我做了一个假设,认为它应该是安全的,因为:它是只读的,并且它是时间(总是在变化)。
get;
内部的代码必须是线程安全的; - VladList.Count
就是一个例子。 - Jon Skeet