. net DateTime线程安全吗?

本文关键字:安全 线程 DateTime net | 更新日期: 2023-09-27 17:53:50

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

. net DateTime线程安全吗?

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

  • 如果你从多个线程同时赋值给同一个属性,你可能会破坏它。

  • 如果你从一个线程读,从另一个线程写,读线程可能会得到损坏的值。

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

实际上,当多个线程同时使用DateTime时,两个32位的一半可能包含不同年龄的值。

可以得到两个写操作的组合。一次写操作的高32位部分,另一次写操作的低32位部分。

作为一种替代方法,您可以为字段使用Int64,并使用ThreadInterlocked中的原子方法对其进行处理。然后使用new DateTime(ticks)dateTime.TicksDateTime转换到/。

MSDN说:

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

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

DateTime是不可变的值类型(struct)。实例一旦创建就不能更改。

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

如果你正在改变一个DateTime 变量从多个线程(无论是写或读/写),你需要同步-因为这个操作是不是线程安全的