- 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;
}
}
}
abatishchev 05.03.2011 19:06 # −3
правда, по отношению к String - абсурдно
bober_maniac 05.03.2011 23:19 # +2
abatishchev 05.03.2011 23:24 # −1
даа, жеесть
absolut 06.03.2011 09:02 # 0
gegMOPO4 06.03.2011 19:46 # 0
absolut 07.03.2011 00:12 # +1
javros 07.03.2011 13:05 # 0
absolut 07.03.2011 13:16 # +1
>Конструктор любого объекта всегда потокобезопасен.
Язык не дает таких гарантий.
javros 07.03.2011 13:30 # 0
absolut 07.03.2011 17:06 # +2
bober_maniac 07.03.2011 13:25 # −1
absolut 07.03.2011 17:14 # 0
bober_maniac 07.03.2011 17:33 # +3
Конечно, конструктор может обращаться к потоконебезопасным данным, но в этом случае отсутствие синхронизации - это банальная ошибка проектирования, а вовсе не проблема отсутствия гарантий в CLR. Простой пример. Представим, что у нас есть следующий код:
Казалось бы, все хорошо. Стал ли метод потокобезопасным? Скорее всего, нет, так как если SomeData.AccessRaw() не обеспечивает потокобезопасности, то к нему может получить доступ другой поток из другой области кода, которая не покрывается синхронизацией CLR.
Единственная реальная гарантия, которая дается CLR - это то, что статический конструктор всегда будет потокобезопасен. Все остальное - это соглашения, которые делают нашу жизнь удобнее. Лично я любой потоконебезопасный конструктор считаю грубейшей ошибкой проектирования, так как для его синхронизации приходится применять глобальные объекты и прочие извращения.
Поэтому конструктор объекта всегда потокобезопасен. Он становится потокобезопасен на уровне CLR в том случае, если работает только со своими методами и членами уровня экземпляра или с другими потокобезопасными объектами и методами. Это для педантов.
absolut 07.03.2011 17:50 # +3
> "я любой потоконебезопасный конструктор считаю грубейшей ошибкой"
вытекает
> "Поэтому конструктор объекта всегда потокобезопасен" .
А если и не вытекает, то как может сосуществовать одновременно?
bober_maniac 07.03.2011 17:51 # 0
FofanovIS 12.03.2011 21:59 # −2