- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
public class XXX
{
private Object m_ForLock = new object();
private String m_Path = "";
public XXX(String Path)
{
lock (m_ForLock)
{
m_Path = Path;
}
}
}
правда, по отношению к String - абсурдно
даа, жеесть
>Конструктор любого объекта всегда потокобезопасен.
Язык не дает таких гарантий.
Конечно, конструктор может обращаться к потоконебезопасным данным, но в этом случае отсутствие синхронизации - это банальная ошибка проектирования, а вовсе не проблема отсутствия гарантий в CLR. Простой пример. Представим, что у нас есть следующий код:
Казалось бы, все хорошо. Стал ли метод потокобезопасным? Скорее всего, нет, так как если SomeData.AccessRaw() не обеспечивает потокобезопасности, то к нему может получить доступ другой поток из другой области кода, которая не покрывается синхронизацией CLR.
Единственная реальная гарантия, которая дается CLR - это то, что статический конструктор всегда будет потокобезопасен. Все остальное - это соглашения, которые делают нашу жизнь удобнее. Лично я любой потоконебезопасный конструктор считаю грубейшей ошибкой проектирования, так как для его синхронизации приходится применять глобальные объекты и прочие извращения.
Поэтому конструктор объекта всегда потокобезопасен. Он становится потокобезопасен на уровне CLR в том случае, если работает только со своими методами и членами уровня экземпляра или с другими потокобезопасными объектами и методами. Это для педантов.
> "я любой потоконебезопасный конструктор считаю грубейшей ошибкой"
вытекает
> "Поэтому конструктор объекта всегда потокобезопасен" .
А если и не вытекает, то как может сосуществовать одновременно?