- 1
- 2
- 3
- 4
- 5
private Boolean active = false;
...
synchronized (active) {
...
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+76
private Boolean active = false;
...
synchronized (active) {
...
}
Чудо синхронизации. Блокируется раз и навсегда.
Судя по мануалу:
http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html
Особой разницы нет.
Должно быть что-то типа synchronized(this).
Тоже считается плохим тоном - если совсем по-правильному.
Имеем утечку приватного мьютекса, пользователь может синхронизироваться на данном объекте и сломать абстракцию. Потому в тех же коллекциях this не используют.
Я бы предпочёл private final AtomicBoolean - если код многопоточный вероятно это лучше чем мутабельная ссылка, на которой синхронизируются.
или private Boolean active = new Boolean(false);
>Например можно заводить один лок на несколько объектов и не боятся дедлока
Согласен. Вот в каллекциях засинхронизировали всё внутри, а итераторы забыли.
А конструкторы полезные с этим самым мьютексом package-private.
Дедлока тут и так не может быть, ибо мутекс захвачен только на время работы метода. И ни один метод, емнип, управление из-под лока не отдает (ну разве что в какой-нибудь equals).
Атомарности это не добавит, ибо мутекс захватывается только на время работы метода коллекции. И если я вызову джва метода - между ними всё равно будет дырка.
Если же я, пытаясь избавиться от этой дырки, захвачу мутекс сам, заранее - то какой смысл захватывать его еще раз внутри методов коллекции? Тут самых обычных коллекций хватит, ибо внешняя синхронизация.
Мапа - раз.
Её view KeySet - два.
Её view valueCollection - три.
Итераторы на keys, values, entries.
Видишь ли view мапы может менять её наравне с обычными методами, и каждый из них необходимо заблочить одним и тем же мьютексом.
Даже в итераторе есть мутирующий remove (что лично по-моим соображениям - ошибка в проектировании, обычный итератор должен быть ronly, т.к. 95% юзкейсов - обычный обход).
Так эти вьюхи же получают этот мутекс в конструкторе, когда мапа их запиливает. Разве нет?
> итераторе
Кстати, а как работает итератор у этих недосинхронизированных коллекциях?
P.S. Нашел - никак не работает. Нужно самому лочиться об мапу :( Поэтому итератор тут не навредит - его за мутексом юзать вообще нельзя.
P.P.S. И я так и не понял, от чего спасёт возможность передачи внешнего мутекса недосинхронизированным коллекциям.
Вьюхи это ответ на вопрос:
>А в чем сакральный смысл делать две коллекции с одним мутексом?
А для независимых особого смысла в передаче мутекса я не вижу.
Ну вот, кстати, в тех же крестах правильно сделали - итератор не может удалять элементы. Зато можно передать этот итератор соотв. методу коллекции, и он выпилит элемент (или несколько).
Автор, утопись в отхожем мисце!