powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос на засыпку: это безопасная публикация или нет?
25 сообщений из 59, страница 2 из 3
Вопрос на засыпку: это безопасная публикация или нет?
    #38627920
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerто есть надо делать так, чтобы к моменты выполнения конструктора все филды уже были инициализированы ?

А нафиг тогда конструктор? :)

А еще есть @PostConstruct
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38627927
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczНет. Надо делать так чтобы другие потоки не могли видеть объект до окончания его инициализации.
Т.е. конструкторы только private, а генератор через статику, коя есть зло если верить соседнему треду. :)
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38627937
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев Т.е. конструкторы только private

Видимость конструтора на публикацию не влияет.
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38627947
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

BlazkowiczНет. Надо делать так чтобы другие потоки не могли видеть объект до окончания его инициализации.


Я читаю это следующим образом:
-как выкопать картошку ?
-Чтобы выкопать картошку надо выкопать картошку.
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38627949
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerЯ читаю это следующим образом:
-как выкопать картошку ?
-Чтобы выкопать картошку надо выкопать картошку.
Бывает
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38627981
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,
судя по всему просто не надо в конструкторе ничего такого делать?
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38628110
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Арсеньевquestionerто есть надо делать так, чтобы к моменты выполнения конструктора все филды уже были инициализированы ?

А нафиг тогда конструктор? :)

А еще есть @PostConstruct

я думал такое только в спринге есть)
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38628223
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
questionerа самое тривиальное я так понимаю сделать ссылки на все поля этого объекта volatile?volatile поля внутри объекта не помогут. А вот если вы сделаете ссылку, которой присваиваете вновь созданный объект volatile, то тогда опубликуете его безопасно, даже без final полей внутри класса.
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38628260
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DEVcoach,

и публиковать уже только тогда, когда объект полностью сконструирован?
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38628283
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
redwhite90и публиковать уже только тогда, когда объект полностью сконструирован?Не совсем понял ваш вопрос. Поясните, пожалуйста.
volatile-запись гарантирует, что все операции, следовавшие в коде до нее будут видны к тому моменту, как станет видна эта запись. То есть, если у нас есть класс:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
class A {
    int field1;
    int field2;

    A(int field1, int field2) {
        this.field1 = field1;
        this.field2 = field2;
    }
}



И где-то есть вот такая декларация:
Код: java
1.
volatile A a;



То вот такая публикация всегда будет безопасной:
Код: java
1.
a = new A(1, 2);
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38628330
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DEVcoach,

DEVcoachНе совсем понял ваш вопрос. Поясните, пожалуйста.

я имел ввиду такую ситуацию.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
Class A{
  A(){
      //сначала обязательно всё корректно инициализируем и только потом
      someThread.threadAField = this;
      somethread.start();
      // тут уже никакой инициализации
   }
}



DEVcoachТо вот такая публикация всегда будет безопасной:
Код: java
1.
a = new A(1, 2);



никак до конца воткнуть не могу.

конкретно тут фраза DEVcoachТо вот такая публикация всегда будет безопасной значит что a.field1 и a.field2 гарантированно выдадут 1 и 2. неужели может быть иначе? контр-пример был бы показателен.
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38628372
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
redwhite90 ,
Да, без volatile и без final они могут быть 0. Показать пример такого кода сложно, так как это надо, что бы JIT зареордерил эти инструкции. Когда он это делает - хз. За ответом надо идти к Шипилеву/Куксенко.
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38628437
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoach redwhite90 ,
Да, без volatile и без final они могут быть 0. Показать пример такого кода сложно, так как это надо, что бы JIT зареордерил эти инструкции. Когда он это делает - хз. За ответом надо идти к Шипилеву/Куксенко.

DEVcoach , Вы запутались, понятно про volatile поля обьекта и приводили примеры, а здесь у вас volatile A a, и тогда причем реордер.
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38628458
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
0FDDEVcoach , Вы запутались, понятно про volatile поля обьекта и приводили примеры, а здесь у вас volatile A a, и тогда причем реордер.Вопрос звучал так:
redwhite90значит что a.field1 и a.field2 гарантированно выдадут 1 и 2. неужели может быть иначе? контр-пример был бы показателен.Ответ приведен выше: да, может, если объект публикуется на в volatile ссылку, и если его поля не final.
В чем я запутался? :-)
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38628478
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoachОтвет приведен выше: да, может, если объект публикуется на в volatile ссылку, и если его поля не final.
В чем я запутался? :-)

Выходит что не-volatile ссылка инициализируется до конструирования обьекта? выделили памать, а дальше, где-то, вызов конструктора, выходит даже в том же потоке есть вероятность получить несконструированный обьект из-за реордера?
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38628493
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
0FD ,
В том же потоке нельзя, так как есть happens-before между всеми соседними операциями. А с другого потока можно увидеть не до конца сконструированный объект.
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38628504
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoach 0FD ,
В том же потоке нельзя, так как есть happens-before между всеми соседними операциями. А с другого потока можно увидеть не до конца сконструированный объект.
Выходит, что ссылка инициализируется только после вызова конструктора в потоке, а как же тогда другой поток увидет ссылку, которая инициализирована до вызова конструктора?
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38628545
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoach,

А не, ссылка на обьект, до вызова конструктора, это нормально.
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38628551
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
0FD ,
Ну это мы возвращаемся к основам JMM и архитектуре современных компьютеров :-) Поток может легко переставить инициализацию ссылки адресом созданного объекта до инициализации всех его полей - это не поломает логику кода в этом потоке. Но если другие потоки увидят эти операции в другом порядке, то это может их "озадачить".
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38628560
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DEVcoach 0FD ,
Поток может легко переставить инициализацию ссылки адресом созданного объекта до инициализации всех его полей.

тут явно с падежами что-то не то
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38628818
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да просто тут как 1 2 3.

a) отводится память;
b) запускается конструктор для указателя на эту память;
d) указатель на память присваивается переменной;
e) читается объект по адресу в переменной.

Оптимизатор JVM (и иногда процессор) полагают, что

- b должно быть после a
- d должно быть после a
- e должно быть после b
- e должно быть после d

Выделенное курсивом (как впрочем и все остальное) рассматривается только в том же потоке, что и a .
На взаимный порядок выполнения b и d ограничений нет.

Для других потоков с инчтрукцией e a,b,d - не существуют.

Однако если вставить операцию
c) захват блокировки, работа с volatile и т.п;

то появятся отношения
- с должно быть после b
- d должно быть после c

и оптимизатор не сможет переставлаять уже b и d в первом потоке.
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38628831
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сложность возникает с публикацией из конструктора.

В конструкторе (если он не default и private) при создании потомка, нет момента когда инициализация закончена, и опубликование безопасно.
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38628926
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я конечно против такого подхода, но
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 public Test() {
    this(1,2);
    new Thread(new MyRunnable(this)).start();
 }

 Test(int a1, int b1) {
    a = a1;
    b = b1;

 }


И что-то я не понял - куда ни глянешь, все паттерны обсуждают,
а тут почему-то забыли зачем нужны фабричные методы и пр.
Впрчем я видел код, где из конструктора вообще вся обработка вызывается, включая несколько коннектов к разным БД.
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38628990
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schwa buldozer01Нет это не безопасная публикация - не обеспечено точечное freeze happens before
Зачем нужен фриз, если есть старт потока, который создает hb по JMM?


hb не транзитивен с freeze hb
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38632128
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
buldozer01,

а что за freeze вообще?

как-то не особо гуглится
...
Рейтинг: 0 / 0
25 сообщений из 59, страница 2 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос на засыпку: это безопасная публикация или нет?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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