- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
public class DefaultQueryEngine implements QueryEngine {
private static volatile QueryEngine DEFAULT;
public static QueryEngine getDefault() {
if (DEFAULT == null) {
DEFAULT = new DefaultQueryEngine(new DefaultEvaluatorFactory(CollQueryTemplates.DEFAULT));
}
return DEFAULT;
}
bormand 15.02.2013 10:42 # +2
absolut 15.02.2013 14:00 # +1
P.S. погуглил, вроде как synchronized должно быть в сигнатуре функции.
someone 15.02.2013 14:16 # +2
absolut 15.02.2013 14:23 # +4
bormand 15.02.2013 15:04 # +1
Во-первых QueryEngine может использовать какие-то эксклюзивные ресурсы, которые второму могут просто не достаться.
Во-вторых - допустим что у QueryEngine есть список ивентЛисенеров, какой-нибудь объект вызвал getDefault, подписался на ивенты, но в этот момент другой поток тоже вызывал getDefault, и в DEFAULT попала именно его версия. Тогда первый объект не получит каких-то событий, возможно важных, а остальные, в свою очередь, не увидят событий, инициированных действиями первого.
Ну и еще что-нибудь связанное с тем, что getDefault() может вернуть несколько различных объектов, если его пользователи ожидают один общий.
Если такие проблемы в данном случае не страшны - ну да, ничего плохого, просто дворнику чуть-чуть больше работы.
Lure Of Chaos 17.02.2013 17:16 # 0
правда, volatile зачем?
bormand 17.02.2013 17:45 # +1
Чтобы он стал потокобезопасным почти синглтоном.
someone 17.02.2013 23:52 # 0
guest 18.02.2014 13:10 # 0