Java дважды проверил блокировку - PullRequest
38 голосов
/ 26 октября 2009

Я случайно натолкнулся на статью, в которой недавно обсуждался шаблон блокировки с двойной проверкой в ​​Java и его подводные камни, и теперь мне интересно, не подвержен ли какой-либо вариант этого шаблона, который я использую в течение многих лет,

Я просмотрел много постов и статей на эту тему и понимаю потенциальные проблемы с получением ссылки на частично построенный объект, и, насколько я могу судить, я не думаю мой реализация зависит от этих вопросов. Есть ли проблемы со следующей схемой?

А если нет, то почему люди не используют его? Я никогда не видел его рекомендованным ни в одном из обсуждений, которые я видел по этому вопросу.

public class Test {
    private static Test instance;
    private static boolean initialized = false;

    public static Test getInstance() {
        if (!initialized) {
            synchronized (Test.class) {
                if (!initialized) {
                    instance = new Test();
                    initialized = true;
                }
            }
        }
        return instance;
    }
}

Ответы [ 11 ]

0 голосов
/ 28 октября 2009

Вероятно, вам следует использовать атомарные типы данных в java.util.concurrent.atomic .

...