. net DateTime线程安全吗?
本文关键字:安全 线程 DateTime net | 更新日期: 2023-09-27 17:53:50
.NET DateTime线程安全吗?我不担心,如果读取操作返回不正确的值,我唯一关心的是:将DateTime对象损坏,如果不同步。
对DateTime
字段的读写不是原子的(至少在32位系统上)。
-
如果你从多个线程同时赋值给同一个属性,你可能会破坏它。
-
如果你从一个线程读,从另一个线程写,读线程可能会得到损坏的值。
-
同时从多个线程中读取而没有写线程是安全的。
实际上,当多个线程同时使用DateTime
时,两个32位的一半可能包含不同年龄的值。
可以得到两个写操作的组合。一次写操作的高32位部分,另一次写操作的低32位部分。
作为一种替代方法,您可以为字段使用Int64
,并使用Thread
和Interlocked
中的原子方法对其进行处理。然后使用new DateTime(ticks)
和dateTime.Ticks
从DateTime
转换到/。
MSDN说:
该类型的所有成员都是线程安全的。看似修改实例状态的成员实际上返回一个用新值初始化的新实例。与任何其他类型一样,对包含该类型实例的共享变量的读写必须受到锁的保护,以保证线程安全。
分配这种类型的实例在所有硬件平台上都不是线程安全的,因为该实例的二进制表示可能太大,无法在单个原子操作中分配。
DateTime
是不可变的值类型(struct)。实例一旦创建就不能更改。
它不会被破坏,并且是线程安全的。
如果你正在改变一个DateTime
变量从多个线程(无论是写或读/写),你需要同步-因为这个操作是不是线程安全的