是int吗?线程安全?

时间:2010-06-15 16:52:03

标签: c# .net thread-safety int

我知道.Net中的所有32位类型(例如intbool等)都是线程安全的。也就是说,不会有部分写入(根据规范)。

但是,这同样适用于int?(可空的int)吗?

3 个答案:

答案 0 :(得分:42)

问题是措辞不力,因此到目前为止答案中的混乱。问题应该是“读取和写入int类型的变量?保证原子?”

不,绝对没有。关于这一点,规范非常明确:

  

以下数据类型的读写是原子的:bool,char,byte,sbyte,short,ushort,uint,int,float和reference类型。此外,在先前列表中具有基础类型的枚举类型的读取和写入也是原子的。其他类型的读写,包括long,ulong,double和decimal,以及用户定义的类型,都不能保证是原子的。

线程完全有可能从可空类型的共享内存变量中读取部分写入的值。

例如,假设你有一个int?变量x,目前的值为null。因此它包含一个设置为零的int和一个设置为false的bool。现在在另一个线程上,你可以将nullable int“5”写入x。另一个线程从x读取不可为空的int零是完全合法的,因为bool中的“true”可以在5设置为int之前设置。

答案 1 :(得分:12)

不,因为int?实际上是由Nullable<int>int组成的结构(bool)。

答案 2 :(得分:3)

来自http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx

  

此类型的任何公共静态(在Visual Basic中为Shared)成员都是线程安全的。任何   实例成员不保证是线程安全的。