.NET DateTime线程安全吗?我不担心读取操作返回的值是否正确,我唯一担心的是:如果不同步,DateTime对象是否会被破坏。
答案 0 :(得分:17)
对DateTime
字段的读写操作不是原子的(至少在32位系统上)。
如果您同时从多个线程分配到同一属性,则可能会损坏它。
如果您从一个线程读取并从另一个线程写入,则读取线程可能会损坏值。
在没有写线程的情况下从多个线程读取是安全的。
基本上,DateTime
的两个32位半部分可能包含同时从多个线程使用的不同年龄的值。
你可以混合两次写入。一次写入的高32位部分和另一次写入的低32位部分。
作为替代方案,您可以对该字段使用Int64
,并使用Thread
和Interlocked
中的原子方法对其进行处理。然后使用new DateTime(ticks)
和dateTime.Ticks
转换为/ DateTime
。
MSDN说:
此类型的所有成员都是线程安全的。似乎修改实例状态的成员实际上返回使用新值初始化的新实例。与任何其他类型一样,读取和写入包含此类实例的共享变量必须通过锁保护以保证线程安全。
在所有硬件平台上分配此类型的实例并非线程安全,因为该实例的二进制表示可能太大而无法在单个原子操作中进行分配。