【发布时间】:2018-09-14 16:44:03
【问题描述】:
class Cat { // Auto-implemented properties. public int Age { get; set; } public string Name { get; set; } } Cat cat = new Cat { Age = 10, Name = "Fluffy" };对象初始值设定项语法允许您创建一个实例,并且 在之后它将新创建的对象及其分配的属性分配给分配中的变量。
与https://stackoverflow.com/a/19138412/432976
var albumData = new Album { Name = "Albumius", Artist = "Artistus", Year = 2013 };是这个等效代码的语法简写:
var albumData = new Album(); albumData.Name = "Albumius"; albumData.Artist = "Artistus"; albumData.Year = 2013;编译后两者完全相同。
问题: 这种类型的构造+分配线程安全吗? (即,另一个读取 cat 的线程是否可以在 Cat 被创建和分配 Age 和 Name 之间看到它)?
第一个似乎是这样,因为它是在分配属性之后,变量被分配(线程安全顺序),第二个说在编译代码级别,顺序是不同的。
如果第二个是真的,下面的代码是否足以避免另一个线程看到一半构造的猫的竞争条件?
var myNewCat = new Cat { Age = 10, Name = "Fluffy" };
sharedCat = myNewCat;
我意识到这里存在次要竞争条件,即其他线程是否看到 oldCat 或 newCat,但在这种情况下,我唯一担心的是其他线程必须看到完整的 Cat,而不是半构造的 Cat。
【问题讨论】:
-
它似乎是线程安全的(即你的第一个引用,而不是你的第二个,是正确的)。 dotnetfiddle.net/iOt7RP
标签: c# multithreading constructor