- 1
- 2
- 3
- 4
- 5
private Boolean active = false;
...
synchronized (active) {
...
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+76
private Boolean active = false;
...
synchronized (active) {
...
}
Чудо синхронизации. Блокируется раз и навсегда.
TauSigma 25.08.2014 21:27 # 0
Судя по мануалу:
http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html
Особой разницы нет.
3.14159265 25.08.2014 21:37 # +1
kegdan 25.08.2014 21:48 # 0
borka 25.08.2014 22:24 # +5
Должно быть что-то типа synchronized(this).
3.14159265 26.08.2014 00:09 # 0
Тоже считается плохим тоном - если совсем по-правильному.
Имеем утечку приватного мьютекса, пользователь может синхронизироваться на данном объекте и сломать абстракцию. Потому в тех же коллекциях this не используют.
Я бы предпочёл private final AtomicBoolean - если код многопоточный вероятно это лучше чем мутабельная ссылка, на которой синхронизируются.
или private Boolean active = new Boolean(false);
borka 26.08.2014 00:41 # 0
3.14159265 27.08.2014 18:23 # 0
>Например можно заводить один лок на несколько объектов и не боятся дедлока
Согласен. Вот в каллекциях засинхронизировали всё внутри, а итераторы забыли.
А конструкторы полезные с этим самым мьютексом package-private.
bormand 27.08.2014 19:02 # 0
Дедлока тут и так не может быть, ибо мутекс захвачен только на время работы метода. И ни один метод, емнип, управление из-под лока не отдает (ну разве что в какой-нибудь equals).
Атомарности это не добавит, ибо мутекс захватывается только на время работы метода коллекции. И если я вызову джва метода - между ними всё равно будет дырка.
Если же я, пытаясь избавиться от этой дырки, захвачу мутекс сам, заранее - то какой смысл захватывать его еще раз внутри методов коллекции? Тут самых обычных коллекций хватит, ибо внешняя синхронизация.
3.14159265 27.08.2014 19:33 # 0
Мапа - раз.
Её view KeySet - два.
Её view valueCollection - три.
Итераторы на keys, values, entries.
Видишь ли view мапы может менять её наравне с обычными методами, и каждый из них необходимо заблочить одним и тем же мьютексом.
Даже в итераторе есть мутирующий remove (что лично по-моим соображениям - ошибка в проектировании, обычный итератор должен быть ronly, т.к. 95% юзкейсов - обычный обход).
bormand 27.08.2014 20:01 # 0
Так эти вьюхи же получают этот мутекс в конструкторе, когда мапа их запиливает. Разве нет?
> итераторе
Кстати, а как работает итератор у этих недосинхронизированных коллекциях?
P.S. Нашел - никак не работает. Нужно самому лочиться об мапу :( Поэтому итератор тут не навредит - его за мутексом юзать вообще нельзя.
P.P.S. И я так и не понял, от чего спасёт возможность передачи внешнего мутекса недосинхронизированным коллекциям.
3.14159265 27.08.2014 23:17 # 0
Вьюхи это ответ на вопрос:
>А в чем сакральный смысл делать две коллекции с одним мутексом?
bormand 28.08.2014 06:31 # 0
А для независимых особого смысла в передаче мутекса я не вижу.
bormand 27.08.2014 20:03 # 0
Ну вот, кстати, в тех же крестах правильно сделали - итератор не может удалять элементы. Зато можно передать этот итератор соотв. методу коллекции, и он выпилит элемент (или несколько).
kegdan 27.08.2014 19:46 # 0
Lennis 26.08.2014 17:38 # +6
guest 26.08.2014 21:41 # −1
Автор, утопись в отхожем мисце!