- 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;
}
P.S. погуглил, вроде как synchronized должно быть в сигнатуре функции.
Во-первых QueryEngine может использовать какие-то эксклюзивные ресурсы, которые второму могут просто не достаться.
Во-вторых - допустим что у QueryEngine есть список ивентЛисенеров, какой-нибудь объект вызвал getDefault, подписался на ивенты, но в этот момент другой поток тоже вызывал getDefault, и в DEFAULT попала именно его версия. Тогда первый объект не получит каких-то событий, возможно важных, а остальные, в свою очередь, не увидят событий, инициированных действиями первого.
Ну и еще что-нибудь связанное с тем, что getDefault() может вернуть несколько различных объектов, если его пользователи ожидают один общий.
Если такие проблемы в данном случае не страшны - ну да, ничего плохого, просто дворнику чуть-чуть больше работы.
правда, volatile зачем?
Чтобы он стал потокобезопасным почти синглтоном.