我知道.Net中的所有32位类型(例如int
,bool
等)都是线程安全的。也就是说,不会有部分写入(根据规范)。
但是,这同样适用于int?
(可空的int)吗?
答案 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)成员都是线程安全的。任何 实例成员不保证是线程安全的。