.NET DateTime线程安全吗?我不担心读取操作返回的值是否正确,我唯一关心的是:如果未同步,DateTime对象是否会损坏。
.NET DateTime线程安全吗?我不担心读取操作返回的值是否正确,我唯一关心的是:如果未同步,DateTime对象是否会损坏。
读取和写入DateTime
字段不是原子的(至少在32位系统上不是)。
如果您在同一时间向多个线程分配同一属性,则可能会损坏它。
如果您从一个线程读取,并从另一个线程写入,则读取线程可能会获得损坏的值。
在没有同时有写入线程的情况下从多个线程读取是安全的。
实际上,当多个线程同时使用时,DateTime
的两个32位半部分可能包含不同年龄的值。
您可以获得两个写入的混合体。一个写入的高32位部分和另一个写入的低32位部分。
作为替代方案,您可以使用Int64
作为该字段,并使用Thread
和Interlocked
的原子方法来处理它。然后使用new DateTime(ticks)
和dateTime.Ticks
进行DateTime
的转换。
MSDN说:
此类型的所有成员都是线程安全的。看起来修改实例状态的成员实际上返回用新值初始化的新实例。与任何其他类型一样,读取和写入包含此类型实例的共享变量必须受锁的保护,以保证线程安全。
在所有硬件平台上,分配此类型的实例并非线程安全,因为该实例的二进制表示形式可能太大而无法在单个原子操作中分配。
这与不可变值类型不同,
但它应该是这与不可变引用类型不同,
。 - mjwillsDateTime
是一个不可变的值类型(结构体)。一旦创建,就无法更改。
它不会被损坏且可以在多线程中安全使用。
如果您从多个线程(无论读取/写入还是仅写入)更改DateTime
变量,则需要进行同步 - 因为此操作不是线程安全的。