- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
public void UpdateCollection()
{
object l = new object();
lock (l)
{
// Обновляем коллекцию
}
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+110
public void UpdateCollection()
{
object l = new object();
lock (l)
{
// Обновляем коллекцию
}
}
Эксклюзивная блокировка в действии
govnomonad 03.07.2013 16:58 # 0
bormand 03.07.2013 19:59 # +3
Что не спасает код от биытия баяном: http://govnokod.ru/11231.
dormendo 03.07.2013 20:44 # 0
myaut 03.07.2013 23:12 # +7
kegdan 03.07.2013 19:17 # +1
lock (new object()){ }
dormendo 03.07.2013 19:55 # 0
TauSigma 03.07.2013 20:07 # 0
Ну или так. Чего-уж мелочиться:
Ну а чтобы веселее дебажилось разбавить всё это красивыми хаками типа:
bormand 03.07.2013 20:18 # 0
И программа превращается... программа превращается... в однопоточную.
dormendo 03.07.2013 20:48 # 0
TauSigma 03.07.2013 20:55 # 0
http://govnokod.ru/62
dormendo 03.07.2013 20:56 # 0
Lure Of Chaos 04.07.2013 00:11 # +2
bormand 04.07.2013 06:40 # +3
Но ведь, если объект дальше своих полей и приватных структур данных никуда не лезет, то в lock(this) нет абсолютно ничего страшного.
А M$, видимо, решило перестраховаться от индусов, и на всякий случай назвало lock(this) порочной практикой, не указывая в каких именно случаях это зло, а когда можно не бояться ;)
Lure Of Chaos 04.07.2013 07:50 # +1
ССЗБ лочиться на внешний монитор
dormendo 04.07.2013 07:50 # 0
bormand 04.07.2013 09:05 # +1
dormendo 04.07.2013 09:22 # 0
Лок(зис) хуже читается, как мне кажется, потому все и создают специальный локер.
bormand 04.07.2013 10:45 # 0
Да ну, нормально он читается :) Локер создают и загоняют в приват чисто ради инкапсуляции, чтобы кроме методов текущего объекта никому не приходила в голову мысль об него лочиться.
roman-kashitsyn 04.07.2013 10:47 # 0
Thread Safety: all methods of this class are thread safe and it's instances must not be locked explicitly.
bormand 04.07.2013 12:03 # 0
roman-kashitsyn 04.07.2013 12:11 # +2
Так и рождается synchronized(concurrentMap)
HaskellGovno 04.07.2013 12:19 # +2
Можно было даже отдельным говнокодом. Самая соль.
dormendo 04.07.2013 12:30 # 0
1. Лочатся они эксклюзивно. Всегда.
2. С ними порой такие перожки получаются, любо-дорого посмотреть.
HaskellGovno 04.07.2013 12:42 # 0
LockFree-коллекции есть? Или LockUnlucky-коллекции? Или LockSeldomForOwner-коллекции?
> перожки получаются, любо-дорого посмотреть.
Какие пирожки?
dormendo 04.07.2013 14:46 # +1
anonimb84a2f6fd141 04.07.2013 18:36 # 0
dormendo 05.07.2013 07:54 # 0
roman-kashitsyn 05.07.2013 08:00 # 0
С кэшем обычно ещё интереснее: данные могут храниться в нескольких структурах одновременно (например, хэш-табличка и LRU-очередь), и синхронизировать нужно сразу несколько объектов.
dormendo 05.07.2013 09:20 # 0
kegdan 05.07.2013 00:27 # 0
Собственно сами ребята из MS говорят
"Как правило, рекомендуется избегать блокировки типа public или экземпляров, которыми код не управляет. Распространенные конструкторы lock (this), lock (typeof (MyType)) и lock ("myLock") не соблюдают это правило.
lock (this) может привести к проблеме, если к экземпляру допускается открытый доступ.
lock (typeof (MyType)) может привести к проблеме, если к MyType допускается открытый доступ.
lock("myLock") может привести к проблеме, поскольку любой код в процессе, используя ту же строку, будет совместно использовать ту же блокировку."
Да не воздай доступа к блокировке своей!
bormand 05.07.2013 05:52 # 0
Блин, мне страшно юзать софт на фреймворке, если там этот лок по строке распространен.
P.S. Разве lock(ченить) это конструктор? Это же специальный оператор.
P.P.S. Открыл инглиш версию. construct (конструкция) а не constructor там написано. Переводчик у них как всегда ёбнутый на голову ;)
lock(null)
kegdan 05.07.2013 08:24 # +1
;)
А чем то подход MS очень даже хорош - считай всех тупым быдлом и не будешь разочарован )
А переводят те же пользователи. Чем сложнее статья - тем хреновее переведена. Инфа 100%.
bormand 05.07.2013 15:07 # 0
О, а я думал, что там нечто типа промпта старается...
kegdan 05.07.2013 15:48 # 0
guest 05.07.2013 21:51 # 0
Починил.
dormendo 05.07.2013 07:56 # 0
guest 05.07.2013 03:16 # 0
Хуевый из меня кеп, да.
dormendo 05.07.2013 07:57 # 0
guest 05.07.2013 15:10 # 0
dormendo 05.07.2013 15:12 # 0
guest 05.07.2013 21:51 # −4
dormendo 08.07.2013 09:48 # 0
Кеп, не забывай подписываться.
kegdan 05.07.2013 08:26 # 0
object l = new object();
lock (l){}
то ничего не изменится
bormand 05.07.2013 09:08 # 0
Программа начнет работать чуточку быстрее из-за меньшего давления на кучу и экономии нескольких инструкций на lock/unlock.
kegdan 05.07.2013 15:00 # 0
И вообще - не позорьте меня перед Кепом!)))
bormand 05.07.2013 15:05 # 0
Это надо этот лок дрочить несколькими тредами. Успешный лок без коллизий практически бесплатен.