[英]Is .NET DateTime thread safe
.NET DateTime线程安全吗? 我不担心读取操作是否返回不正确的值,我唯一担心的是:如果未同步,DateTime对象是否会被破坏。
对DateTime
字段的读取和写入不是原子的(至少在32位系统上)。
如果您同时从多个线程分配到同一属性,则可能会损坏它。
如果从一个线程读取并从另一个线程写入,则读取线程可能会损坏值。
在没有写入线程的情况下从多个线程读取是安全的。
基本上,当从多个线程同时使用时, DateTime
的两个32位半部分可能包含不同年龄的值。
你可以混合使用两次写入。 一次写入的高32位部分,另一次写入的低32位部分。
作为替代方案,您可以将Int64
用于该字段,并使用Thread
和Interlocked
原子方法对其进行处理。 然后使用new DateTime(ticks)
和dateTime.Ticks
转换为DateTime
。
MSDN说:
此类型的所有成员都是线程安全的。 似乎修改实例状态的成员实际上返回使用新值初始化的新实例。 与任何其他类型一样, 必须通过锁保护对包含此类实例的共享变量的读写,以保证线程安全 。
分配此类型的实例在所有硬件平台上都不是线程安全的,因为该实例的二进制表示可能太大而无法在单个原子操作中分配。
DateTime
是一个不可变的值类型(struct)。 创建后无法更改实例。
它不会被破坏并且是线程安全的。
如果要从多个线程(写入或读取/写入)更改DateTime
变量 ,则需要同步 - 因为此操作不是线程安全的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.