powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Даёт ли static какие-то гарантии публикации/видимости в контексте многопоточности?
16 сообщений из 16, страница 1 из 1
Даёт ли static какие-то гарантии публикации/видимости в контексте многопоточности?
    #39512797
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Одна ситуация вынудила запилить вопросец.
На первый взгляд ничего по этому поводу в голову не приходит, но если начать читать про синглтоны первые попавшиеся статейки, то вот что получается:

http://www.journaldev.com/1377/java-singleton-design-pattern-best-practices-examples#static-block-initialization

тут у них final
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class EagerInitializedSingleton {
    
    private static final EagerInitializedSingleton instance = new EagerInitializedSingleton();
    
    //private constructor to avoid client applications to use constructor
    private EagerInitializedSingleton(){}

    public static EagerInitializedSingleton getInstance(){
        return instance;
    }
}




а тут как бы нет

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
public class StaticBlockSingleton {

    private static StaticBlockSingleton instance;
    
    private StaticBlockSingleton(){}
    
    //static block initialization for exception handling
    static{
        try{
            instance = new StaticBlockSingleton();
        }catch(Exception e){
            throw new RuntimeException("Exception occured in creating singleton instance");
        }
    }
    
    public static StaticBlockSingleton getInstance(){
        return instance;
    }
}



И всплывает что-то в памяти, что где-то читал, что static инициализируется при загрузке класса(что тоже вызывает сомнения, ибо я всё таки считаю, что не при инициализации а при обращении) и это даёт типа какие-то гарантии.

Поясните плиз.
...
Рейтинг: 0 / 0
Даёт ли static какие-то гарантии публикации/видимости в контексте многопоточности?
    #39512802
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и тут ещё пишут:



http://www.journaldev.com/171/thread-safety-in-java-singleton-classes-with-example-code There are three ways through which we can achieve thread safety.

Create the instance variable at the time of class loading.

Pros:
Thread safety without synchronization
Easy to implement

Cons:
Early creation of resource that might not be used in the application.
The client application can’t pass any argument, so we can’t reuse it. For example, having a generic singleton class for database connection where client application supplies database server properties.
...
Рейтинг: 0 / 0
Даёт ли static какие-то гарантии публикации/видимости в контексте многопоточности?
    #39512803
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerя всё таки считаю, что не при инициализации а при обращении
Я тебе уже давал ссылку на JLS. Там академически точно описан порядок загрузки и инициализации класса. А ты выдумаваешь что-то своё.
...
Рейтинг: 0 / 0
Даёт ли static какие-то гарантии публикации/видимости в контексте многопоточности?
    #39512805
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerПоясните плиз.
Самый классный вопрос. Что именно пояснять? Subj? Так тоже, вроде, просто всё. Открываем JMM
https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.4
и ищем всё про static.
...
Рейтинг: 0 / 0
Даёт ли static какие-то гарантии публикации/видимости в контексте многопоточности?
    #39512817
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczquestionerя всё таки считаю, что не при инициализации а при обращении
Я тебе уже давал ссылку на JLS. Там академически точно описан порядок загрузки и инициализации класса. А ты выдумаваешь что-то своё.

что не при инициализации загрузке а при обращении

Blazkowicz https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.4
и ищем всё про static.

Это ж пипец не для человеков чтиво. Я вот не увидел никаких гарантий
...
Рейтинг: 0 / 0
Даёт ли static какие-то гарантии публикации/видимости в контексте многопоточности?
    #39512822
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerИ всплывает что-то в памяти, что где-то читал, что static инициализируется при загрузке класса(что тоже вызывает сомнения, ибо я всё таки считаю, что не при инициализации а при обращении) и это даёт типа какие-то гарантии.

Поясните плиз.

Гарантии даёт только страховой полис final . Статик или нет- уже не столь важно.
Если static final то любой кто обратился к классу получет корректный (если других ошибок нет) объект в поле. Всё.
Только надо понимать, что это обеспечивается через синхронизацию на глобальном объекте (именно static ), поэтому при создании таких объектов не надо делать что-то долго, а то можно всю JVM раком поставить
...
Рейтинг: 0 / 0
Даёт ли static какие-то гарантии публикации/видимости в контексте многопоточности?
    #39512839
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey TominquestionerИ всплывает что-то в памяти, что где-то читал, что static инициализируется при загрузке класса(что тоже вызывает сомнения, ибо я всё таки считаю, что не при инициализации а при обращении) и это даёт типа какие-то гарантии.

Поясните плиз.

Гарантии даёт только страховой полис final . Статик или нет- уже не столь важно.
Если static final то любой кто обратился к классу получет корректный (если других ошибок нет) объект в поле. Всё.
Только надо понимать, что это обеспечивается через синхронизацию на глобальном объекте (именно static ), поэтому при создании таких объектов не надо делать что-то долго, а то можно всю JVM раком поставить

Да, я тоже так думаю, только непонятно почему в интернете куча информации, противоречащая этой
...
Рейтинг: 0 / 0
Даёт ли static какие-то гарантии публикации/видимости в контексте многопоточности?
    #39512854
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerкуча информации, противоречащая этой
Например?
...
Рейтинг: 0 / 0
Даёт ли static какие-то гарантии публикации/видимости в контексте многопоточности?
    #39512871
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczquestionerкуча информации, противоречащая этой
Например?

например

https://habrahabr.ru/post/27108/

читать от авторИ вы будете правы, так как проблему многопоточности мы решили
...
Рейтинг: 0 / 0
Даёт ли static какие-то гарантии публикации/видимости в контексте многопоточности?
    #39512880
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerчитать от
Как это можно вообще читать???
OMFG1. Ленивую инициализацию (Объект instance будет создан classloader-ом во время инициализации класса)
2. Отсутствует возможность обработки исключительных ситуаций(exceptions) во время вызова конструктора
1. А то что загрузка и инициализация классов в Java ленивая для автора открытие?
2. Это вообще за гранью. 100500 вариантов обработать исключение хоть в конструкторе, хоть в блоке статической инициализации, но у автора "отсутствует возможность".
...
Рейтинг: 0 / 0
Даёт ли static какие-то гарантии публикации/видимости в контексте многопоточности?
    #39512899
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczquestionerчитать от
Как это можно вообще читать???
OMFG1. Ленивую инициализацию (Объект instance будет создан classloader-ом во время инициализации класса)
2. Отсутствует возможность обработки исключительных ситуаций(exceptions) во время вызова конструктора
1. А то что загрузка и инициализация классов в Java ленивая для автора открытие?
2. Это вообще за гранью. 100500 вариантов обработать исключение хоть в конструкторе, хоть в блоке статической инициализации, но у автора "отсутствует возможность".

1 - по ходу да

2 - он имеет ввиду конкретно в этой имплементации
...
Рейтинг: 0 / 0
Даёт ли static какие-то гарантии публикации/видимости в контексте многопоточности?
    #39512902
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дата публикации - 9 июня 2008 в 18:30

Зачем такое новье читать? Лучше классику из 90-х
...
Рейтинг: 0 / 0
Даёт ли static какие-то гарантии публикации/видимости в контексте многопоточности?
    #39512905
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл ник,

с тех пор static изменил поведение? или раньше одни идиоты жили?
...
Рейтинг: 0 / 0
Даёт ли static какие-то гарантии публикации/видимости в контексте многопоточности?
    #39512909
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerс тех пор static изменил поведение?
Вот тут конкретно про блокировки с п.1 по пп.4/5
https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html#jvms-5.5
...
Рейтинг: 0 / 0
Даёт ли static какие-то гарантии публикации/видимости в контексте многопоточности?
    #39512911
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

http://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.4.2

ну да, тут же смотрю

http://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.4.2 For each class or interface C, there is a unique initialization lock LC . The mapping from C to LC is left to the discretion of the Java Virtual Machine implementation. The procedure for initializing C is then as follows:

Synchronize on the initialization lock, LC, for C. This involves waiting until the current thread can acquire LC.

If the Class object for C indicates that initialization is in progress for C by some other thread, then release LC and block the current thread until informed that the in-progress initialization has completed, at which time repeat this step.

If the Class object for C indicates that initialization is in progress for C by the current thread, then this must be a recursive request for initialization. Release LC and complete normally.

If the Class object for C indicates that C has already been initialized, then no further action is required. Release LC and complete normally.

If the Class object for C is in an erroneous state, then initialization is not possible. Release LC and throw a NoClassDefFoundError.

...

мелкий шрифт

An implementation may optimize this procedure by eliding the lock acquisition in step 1 (and release in step 4/5) when it can determine that the initialization of the class has already completed, provided that, in terms of the memory model, all happens-before orderings that would exist if the lock were acquired, still exist when the optimization is performed.

Так что получается безопасно и без final что ли?
...
Рейтинг: 0 / 0
Даёт ли static какие-то гарантии публикации/видимости в контексте многопоточности?
    #39513433
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Молчание - признак согласия.

В общем я тогда буду уверен, что если static инициализируется в блоке инициализации или inline, то видимость и так гарантирована и final писать не обязательно.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Даёт ли static какие-то гарантии публикации/видимости в контексте многопоточности?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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