在 C# 中,只要变量的大小最多native int
(即 32 位运行时环境中的 4 个字节和 64 位运行时环境中的 8 个字节),为变量设置值是原子的。在包含所有引用类型和大多数内置值类型(byte
、short
、int
、long
等)的 64 位环境中。
设置更大的值不是原子的,并且可能导致仅更新部分内存的撕裂。
DateTime
是一个结构,它仅包含一个ulong
包含其所有数据(Ticks
和DateTimeKind
)的字段,并且ulong
在 64 位环境中其本身是原子的。
这是否意味着它DateTime
也是原子的?或者下面的代码会在某些时候导致撕裂吗?
static DateTime _value;
static void Main()
{
for (int i = 0; i < 10; i++)
{
new Thread(_ =>
{
var random = new Random();
while (true)
{
_value = new DateTime((long)random.Next() << 30 | (long)random.Next());
}
}).Start();
}
Console.ReadLine();
}