15

.NET DateTime 线程安全吗?如果读取操作返回不正确的值,我并不担心,我唯一担心的是:如果不同步,DateTime 对象是否会损坏。

4

2 回答 2

23

对字段的读写DateTime不是原子的(至少在 32 位系统上)。

  • 如果您同时从多个线程分配给同一个属性,您可能会损坏它。

  • 如果您从一个线程读取并从另一个线程写入,则读取线程可能会获得损坏的值。

  • 从多个线程读取而同时没有写入线程是安全的。

DateTime本质上,当从多个线程同时使用时,a 的两个 32 位半部分可能包含不同年龄的值。

您可以混合使用两种写入。一次写入的高 32 位部分和另一次写入的低 32 位部分。

作为替代方案,您可以使用for 字段,并使用来自andInt64的原子方法处理它。然后使用and转换为/从.ThreadInterlockednew DateTime(ticks)dateTime.TicksDateTime

MSDN 说:

这种类型的所有成员都是线程安全的。看起来修改实例状态的成员实际上返回一个用新值初始化的新实例。与任何其他类型一样,对包含此类型实例的共享变量的读取和写入必须由锁保护以保证线程安全

在所有硬件平台上分配这种类型的实例并不是线程安全的,因为该实例的二进制表示可能太大而无法在单个原子操作中分配。

于 2013-01-15T19:19:18.923 回答
10

DateTime是一个不可变的值类型(结构)。实例一经创建便无法更改。

它不会被破坏并且是线程安全的。

如果要从多个线程(写入或读取/写入)更改DateTime 变量,则需要同步 - 因为此操作不是线程安全的。

于 2013-01-15T19:16:13.297 回答