Я хотел бы знать, являются ли С# автоматически реализованные свойства, например public static T Prop { get; set; }
, потокобезопасными или нет. Спасибо!
Являются ли С# автоматически реализованными статические свойства потокобезопасными?
Ответ 1
Это не так. Это декомпиляция с помощью Reflector:
private static string Test
{
[CompilerGenerated]
get
{
return <Test>k__BackingField;
}
[CompilerGenerated]
set
{
<Test>k__BackingField = value;
}
}
Ответ 2
В разделе 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; } }
}
Это то, что мы обещаем, и то, что вы получаете. Точка авто недвижимости - это сделать самую основную, простую, дешевую вещь; если вы хотите сделать что-то более интересное, тогда вы должны написать "реальное" свойство.
Ответ 3
Нет. Вы должны обернуть их механизмами блокировки потоков.
object _lock = new object();
public static Main(string[] args)
{
lock(_lock)
{
Prop = new T();
}
T val = null;
lock(_lock)
{
val = Prop;
}
}
Ответ 4
Я так не верю. Я считаю, что это просто синтаксический сахар для:
private static T _prop;
public static T Prop
{
get { return _prop; }
set { _prop = value; }
}
Ответ 5
Синхронизация не обеспечивается с автоматическими свойствами, включая статические свойства.
Если вам нужна полная безопасность потоков, вы захотите использовать свои собственные свойства с помощью поля поддержки и самостоятельно выполнить синхронизацию.
Ответ 6
Для полноты, полевые события do встроены в потокобезопасность, но в этом они одни. Автоматически реализованные свойства не имеют таких функций. Вы можете, однако, сделать что-то вроде:
public static double SomeProp
{ // ### NOT RECOMMENDED ###
[MethodImpl(MethodImplOptions.Synchronized)] get;
[MethodImpl(MethodImplOptions.Synchronized)] set;
}
Проблема заключается в том, что он заблокирует Type
, который является плохой вещью. Я лично выполнил бы свою собственную синхронизацию.
Ответ 7
Нет, они не потокобезопасны. Статические свойства, столь же уязвимые, как статические поля, относятся к concurrency проблемам.