powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / volatile and synchronized в енумах
23 сообщений из 23, страница 1 из 1
volatile and synchronized в енумах
    #38925175
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
на хабре вычитал 2 реализации синглтона

РАЗ

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class Singleton {
    private static Singleton instance;
    
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}



два

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public class Singleton {
        private static volatile Singleton instance;
    
        public static Singleton getInstance() {
        Singleton localInstance = instance;
        if (localInstance == null) {
            synchronized (Singleton.class) {
                localInstance = instance;
                if (localInstance == null) {
                    instance = localInstance = new Singleton();
                }
            }
        }
        return localInstance;
    }
}




Почему в первом случае не надо volatile ?
...
Рейтинг: 0 / 0
volatile and synchronized в енумах
    #38925238
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
redwhite90на хабре вычитал 2 реализации синглтона

РАЗ

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class Singleton {
    private static Singleton instance;
    
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}



два

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public class Singleton {
        private static volatile Singleton instance;
    
        public static Singleton getInstance() {
        Singleton localInstance = instance;
        if (localInstance == null) {
            synchronized (Singleton.class) {
                localInstance = instance;
                if (localInstance == null) {
                    instance = localInstance = new Singleton();
                }
            }
        }
        return localInstance;
    }
}




Почему в первом случае не надо volatile ?

P.S.
С сабжектом я погорячился)

http://stackoverflow.com/questions/70689/what-is-an-efficient-way-to-implement-a-singleton-pattern-in-java

вот тут почему-то в топе не нашёл ответов с DCL
...
Рейтинг: 0 / 0
volatile and synchronized в енумах
    #38925241
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
volatile обеспечивает сериализацию чтения/записи переменной instance между различными потоками. В первом случае этого не требуется, так как доступ к synchronized-методу - последовательный.
Вот при чем тут енумы (из заголовка) - загадка :)
А мне нравится такой синглтон:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class Singleton {
    private class SingletonHolder {
        static Singleton instance = new Singleton()
    }
    
    public static Singleton getInstance() {
        return SingletonHolder.instance;
    }
}
...
Рейтинг: 0 / 0
volatile and synchronized в енумах
    #38925268
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как же вы заколебали своим DCL.
...
Рейтинг: 0 / 0
volatile and synchronized в енумах
    #38925278
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ivanra,

Да, видимо про синглтон на енумах думал и написал))

а во втором случае ведь тоже синхронайзд
...
Рейтинг: 0 / 0
volatile and synchronized в енумах
    #38925281
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczКак же вы заколебали своим DCL.

Эта эмоция мне нравится.

У меня складывается, что DCL какая-то антинаучная х...
...
Рейтинг: 0 / 0
volatile and synchronized в енумах
    #38925290
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90Эта эмоция мне нравится.

Потому что это уже 3й или 5й топик про DCL.

redwhite90У меня складывается, что DCL какая-то антинаучная х...
Это как раз научная исследовательская фигня, которая к практическому применению имеет слабое отношение.
...
Рейтинг: 0 / 0
volatile and synchronized в енумах
    #38925317
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczredwhite90Эта эмоция мне нравится.

Потому что это уже 3й или 5й топик про DCL.

redwhite90У меня складывается, что DCL какая-то антинаучная х...
Это как раз научная исследовательская фигня, которая к практическому применению имеет слабое отношение.
проясните тогда плиз в чем с точки зрения науки разница между первым и вторым случаем и нафига надо локальная копия?
...
Рейтинг: 0 / 0
volatile and synchronized в енумах
    #38925342
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90проясните тогда плиз в чем с точки зрения науки разница между первым и вторым случаем и нафига надо локальная копия?
Для потокобезопасной ленивой инициализации, которая бы исключала взаимоблокировки потоков при доступе к уже проинициализированному синглтону. spinlock, по-моему, сводит проблему взаимоблокировки к минимуму. Поэтому её оптимизация выглядит сомнительной.

Опять же, практических сценариев, где такое нужно почти не встречается. А там где встречается, можно применить более простой и не менее эффективный код. Поэтому DCL это сугубо академическая проблема.
...
Рейтинг: 0 / 0
volatile and synchronized в енумах
    #38925368
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
redwhite90,
вот хорошая статья про dcl (к сожалению, автор спрятал, но в архивах всё найдется):
https://web.archive.org/web/20121108114236/http://habrahabr.ru/post/143390/
...
Рейтинг: 0 / 0
volatile and synchronized в енумах
    #38925836
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90BlazkowiczКак же вы заколебали своим DCL.

Эта эмоция мне нравится.

У меня складывается, что DCL какая-то антинаучная х...

Потому что давно есть другое решение, проще. Всё за нас делает jvm.
А DCL - это просто разминка для ума.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
class SingletonHelper {
     static Singleton instance = new Singleton();
}
public class Singleton {
    public static Singleton getInstance() {
        return SingletonHelper.instance; 
    }
}
...
Рейтинг: 0 / 0
volatile and synchronized в енумах
    #38926032
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уже второй пишет holder для singleton без final.
Вы предполагаете, что его потом можно будет поменять?

DCL практически не нужен, когда singleton 1 и можно положиться на внутренний механизм jvm с блокировками при загрузке класса.

Другое дело, когда getter выглядит, например, так:
Код: java
1.
 public Singleton getInstance(final String name)
...
Рейтинг: 0 / 0
volatile and synchronized в енумах
    #38926151
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей АрсеньевУже второй пишет holder для singleton без final.
Вы предполагаете, что его потом можно будет поменять?

DCL практически не нужен, когда singleton 1 и можно положиться на внутренний механизм jvm с блокировками при загрузке класса.

Другое дело, когда getter выглядит, например, так:
Код: java
1.
 public Singleton getInstance(final String name)



нет, но не думаю, что это баг.
...
Рейтинг: 0 / 0
volatile and synchronized в енумах
    #38926447
vimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tominredwhite90пропущено...


Эта эмоция мне нравится.

У меня складывается, что DCL какая-то антинаучная х...

Потому что давно есть другое решение, проще. Всё за нас делает jvm.
А DCL - это просто разминка для ума.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
class SingletonHelper {
     static Singleton instance = new Singleton();
}
public class Singleton {
    public static Singleton getInstance() {
        return SingletonHelper.instance; 
    }
}


It depends...

Если new Singleton() может выкинуть эксепшен, например при инициализации нужно вычитать настройки синглтона из какого-то внешнего хранилища, и в момент конструирования синглтона это хранилище в дауне, то тут два варианта:
1. Требования таковы что программа не должна продолжать работать - тогда действительно проще всего положиться на JDK, ошибка при инициализации класса SingletonHelper будет приводить к NoClassDefFoundError для вех последующих обращений к методу getInstance класса Singleton.
2. Ежели требования таковы что нужно дать клиентам второй шанс на инициализацию синглтона, то тут уже нам и понадобится понимание DCL. Я правда не понимаю зачем в таком кейсе платить за volatile, когда можно положиться на гарантии безопасной публикации для final полей используя холдер с final полем:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
public class Singleton {

    private static Holder holder;

    public static Singleton getInstance() {
        if (holder == null) {
            synchronized (Holder.class) {
                if (holder == null) {
                    holder = new Holder(new Singleton());
                }
            }
        }
        return holder.singleton;
    }

    private static class Holder {

        final Singleton singleton;
        
        public Holder(Singleton singleton) {
            this.singleton = singleton;
        }

    }

}
...
Рейтинг: 0 / 0
volatile and synchronized в енумах
    #38926458
vimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90... и нафига надо локальная копия?
В данном случае локальная копия не нужна, так как судя по коду инициализация синглтона полностью происходит в конструкторе. Страшилки про локальную переменную нужны, когда класс синглтона не полностью инициализируется своим конструктором и нужно на нем еще всякие сеттеры подергать. В таком кейсе локальная переменная нужна для того чтобы не опубликовыть недоинициализированный объект раньше времени, вот например если так написать без локальной переменной то может случиться что-то нехорошее:

public class Singleton {
private static volatile Singleton instance;

public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
// FAIL! опубликованна ссылка на недоинициализированный объект.
instance = new Singelton();

instance.setSomething(System.getProperty("blah-blah"));
}
}
}
return instance ;
}
}
...
Рейтинг: 0 / 0
volatile and synchronized в енумах
    #38926473
vimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
черт забыл отформатировать:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
public class Singleton {
    private static volatile Singleton instance;

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    // FAIL! опубликованна ссылка на недоинициализированный объект.
                    instance = new Singelton();
                    
                    // пока мы делаем setSomething, ссылку на instance уже кто-то мог прочитать и воспользоватьсся недоинициализированным объектом
                    instance.setSomething(System.getProperty("blah-blah"));
                }
            }
        }
        return instance;
    }
} 
...
Рейтинг: 0 / 0
volatile and synchronized в енумах
    #38926738
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczКак же вы заколебали своим DCL.
Эта тема действительно раз в квартал всплывает в топиках. Будоражит всем
моск. Тонет и потом неизбежно снова возвращается. В другой инкарнации.
Но суть - та-же.
...
Рейтинг: 0 / 0
volatile and synchronized в енумах
    #38926747
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominПотому что давно есть другое решение, проще. Всё за нас делает jvm.
А DCL - это просто разминка для ума.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
class SingletonHelper {
     static Singleton instance = new Singleton();
}
public class Singleton {
    public static Singleton getInstance() {
        return SingletonHelper.instance; 
    }
}

Синглтон - это не обязательно "что-то в одном экземпляре на класслоадер", как в вашем случае. Это может быть что-то с "в одном экземпляре на инстанс некоторого объекта"; что-то, что нужно грузить максимально лениво; что-то, что надо иногда обнулять, и т.д..
И для всех этих случаев ваше решение не подходит.
...
Рейтинг: 0 / 0
volatile and synchronized в енумах
    #38926761
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никакая это не разминка для ума.

Разминка для ума - это Гипотеза Римана.

А эта хрень требует исторических знаний что было в Java 1.4 и потом Java 5.
Потом она требует рисования диаграммы состояний. И обзначения стрелками
"что" и "зачем" инстанциируется. И для двух и более потоков рассмотреть кейсы
гонок.
...
Рейтинг: 0 / 0
volatile and synchronized в енумах
    #38926934
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cdtyjv,
синглтон с холдером - ленивый, так же, как и его обфусцированный вариант на енумах. Всё остальное - верно
...
Рейтинг: 0 / 0
volatile and synchronized в енумах
    #39073424
Фотография OracleLover
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanravolatile обеспечивает сериализацию чтения/записи переменной instance между различными потоками. В первом случае этого не требуется, так как доступ к synchronized-методу - последовательный.
Вот при чем тут енумы (из заголовка) - загадка :)
А мне нравится такой синглтон:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class Singleton {
    private class SingletonHolder {
        static Singleton instance = new Singleton()
    }
    
    public static Singleton getInstance() {
        return SingletonHolder.instance;
    }
}



Ребят объясните этот выделенный коммент. Вот в вики в разделе happens before пишут об этом моменте, но мне непонятно почему он работает именно так и как это достигается.
Разве volatile-переменная не убирает просто оптимизацию сохранения переменной в кеш ядра процессора?

Т.е если я убираю volatile на двухядерной машине и создаю два потока таким образом что каждый выполняется на отдельном ядре что происходит в этом случае - переменная не убирается в кеш? или второй поток когда до него дойдет время уже получит обновленное значение?
...
Рейтинг: 0 / 0
volatile and synchronized в енумах
    #39075370
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OracleLoverivanravolatile обеспечивает сериализацию чтения/записи переменной instance между различными потоками. В первом случае этого не требуется, так как доступ к synchronized-методу - последовательный.


Ребят объясните этот выделенный коммент. Вот в вики в разделе happens before пишут об этом моменте, но мне непонятно почему он работает именно так и как это достигается.

Блокировкой. Соответственно в HB нельзя переходить ее.
Грубо говоря нельзя прочитать instance до захвата блокировки, а захватить до отпускания ранее проинициализировавшим класс потоком. А поток не сможет отпустить блокировку раньше окончания инициализации.
Так должна быть устроена jvm.
OracleLoverРазве volatile-переменная не убирает просто оптимизацию сохранения переменной в кеш ядра процессора?

На самом деле нет. То что описываете Вы - это механизм, при помощи которого он достигается.
Volatile обеспечивает согласованный доступ к переменной с сериализацией по времени.
Ну и HB до кучи.
...
Рейтинг: 0 / 0
volatile and synchronized в енумах
    #39075373
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл добавить по первому пункту, это все хорошо пока весь доступ только через getInstance и конструктор случайно нигде не публикует ссылку на instance.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / volatile and synchronized в енумах
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]