[英]Are C# auto-implemented static properties thread-safe?
我想知道 C# 是否自动实现了属性,比如public static T Prop { get; set; }
public static T Prop { get; set; }
public static T Prop { get; set; }
,是线程安全与否。 谢谢!
C# 规范的第 10.7.4 节指出:
当属性被指定为自动实现的属性时,隐藏的支持字段将自动可用于该属性,并且访问器被实现为从该支持字段读取和写入。 下面的例子:
public class Point {
public int X { get; set; } // automatically implemented
public int Y { get; set; } // automatically implemented
}
等效于以下声明:
public class Point {
private int x;
private int y;
public int X { get { return x; } set { x = value; } }
public int Y { get { return y; } set { y = value; } }
}
这就是我们的承诺,这就是您得到的。 汽车属性的意义在于做最基本、最简单、最便宜的事情; 如果你想做一些更高级的事情,那么你应该写一个“真实的”属性。
看来不是。 这是使用 Reflector 的反编译:
private static string Test
{
[CompilerGenerated]
get
{
return <Test>k__BackingField;
}
[CompilerGenerated]
set
{
<Test>k__BackingField = value;
}
}
不可以。您必须将它们包裹在螺纹锁定机制中。
object _lock = new object();
public static Main(string[] args)
{
lock(_lock)
{
Prop = new T();
}
T val = null;
lock(_lock)
{
val = Prop;
}
}
自动属性(包括静态属性)没有提供同步。
如果您需要完整的线程安全,您将需要使用您自己的属性和一个支持字段,并自己处理同步。
为了完整起见,类似字段的事件确实具有内置的线程安全性,但它们是唯一的。 自动实现的属性没有任何此类功能。 但是,您可以执行以下操作:
public static double SomeProp
{ // ### NOT RECOMMENDED ###
[MethodImpl(MethodImplOptions.Synchronized)] get;
[MethodImpl(MethodImplOptions.Synchronized)] set;
}
这样做的问题是它会锁定Type
,这是一件坏事。 我个人会为此实现自己的同步。
我不相信。 我相信它们只是以下方面的语法糖:
private static T _prop;
public static T Prop
{
get { return _prop; }
set { _prop = value; }
}
不,它们不是线程安全的。 静态属性与静态字段一样容易受到并发问题的影响。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.