powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос на засыпку: это безопасная публикация или нет?
59 сообщений из 59, показаны все 3 страниц
Вопрос на засыпку: это безопасная публикация или нет?
    #38384877
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
class Test {
int a;
int b;

public Test() {
a = 1;
b = 2;

new Thread(new MyRunnable(this)).start();
}

class MyRunnable implements Runnable {
private Test test;

private MyRunnable(Test test) {
this.test = test;
}

public void run() {
System.out.println(test.a + test.b);
}
}
}
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38384878
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения. Вот:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
class Test {
    int a;
    int b;    

    public Test() {
        a = 1;
        b = 2;

        new Thread(new MyRunnable(this)).start();
    }

    class MyRunnable implements Runnable {
        Test test;

        private MyRunnable(Test test) {
            this.test = test;
        }

        public void run() {
            System.out.println(test.a + test.b);
        }
    }
}
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38384979
maxkar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoach,

Публикация кого? a и b относительно потокобезопасности? Да, безопасная.
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38385029
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxkarПубликация кого? a и b относительно потокобезопасности? Да, безопасная.Публикация объекта Test во вновь создаваемый поток. То есть, увидит ли новый поток этот объект в гарантированно консистентном состоянии?
Если да - почему? Нет - тоже почему?
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38385272
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvЕсли да - почему?
А сам то как думаешь, могут ли две независимых переменных быть в консистентном состоянии если для доступа к ним не используются блокировки?

Ведь изменить свойства a и b может любой класс из пакета.
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38385292
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это называется не публикация(?). Я не вижу тут ни одного геттера.

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

Если мы так делаем, никто не гарантирует, что run начнет выполняться после полной отработки конструктора. В результате MyRunnable будет какое-то время юзать не полностью сконструированый обьект. Это не вполне хорошо и в будущем (когда в код подобавляют функционала) может привести к багам. Но "сейчас", мне кажется, что это безопасно (правда бить себя кулаком в грудь не стану). Но лучше так не делать.

автор могут ли две независимых переменных быть в консистентном состоянии если для доступа к ним не используются блокировки?

Если говорить лишь о них, то в данном случае они happence-before, т.к. устанавливаются до создания потока, поэтому с этим должно быть все ок.
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38385297
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.4

A call to start() on a thread happens-before any actions in the started thread.
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38385339
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Арсеньев А сам то как думаешь, могут ли две независимых переменных быть в консистентном состоянии если для доступа к ним не используются блокировки?
Ведь изменить свойства a и b может любой класс из пакета.Все никак не могу нормально сформулировать вопрос. Пробую еще раз: можем ли мы быть уверены, что увидим из MyRunnable.run() a = 1 и b = 2, при условии, что никто их не меняет? Гарантированно ли будет распечатано 3?
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38385491
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoachСергей Арсеньев А сам то как думаешь, могут ли две независимых переменных быть в консистентном состоянии если для доступа к ним не используются блокировки?
Ведь изменить свойства a и b может любой класс из пакета.Все никак не могу нормально сформулировать вопрос. Пробую еще раз: можем ли мы быть уверены, что увидим из MyRunnable.run() a = 1 и b = 2, при условии, что никто их не меняет? Гарантированно ли будет распечатано 3?
В данном случае да, особенно если сделать класс Test как final. Хотя конечно не стоит на это завязываться, но как я понял тут обсуждается именно теоретический аспект.
Вот тут ребята из конкурренси-интерест обсудили это -
http://cs.oswego.edu/pipermail/concurrency-interest/2010-December/007567.html
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38385500
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл никВ данном случае да, особенно если сделать класс Test как final.А как final может повлиять здесь?
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38385518
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoach,

В этом примере никак, но если представить что это класс бибилиотечный - и кому-то вздумалось его заэкстендить - то быть беде скорее всего, почитайте по ссылке
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38385560
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никDEVcoachпропущено...
Все никак не могу нормально сформулировать вопрос. Пробую еще раз: можем ли мы быть уверены, что увидим из MyRunnable.run() a = 1 и b = 2, при условии, что никто их не меняет? Гарантированно ли будет распечатано 3?
В данном случае да, особенно если сделать класс Test как final. Хотя конечно не стоит на это завязываться, но как я понял тут обсуждается именно теоретический аспект.
Вот тут ребята из конкурренси-интерест обсудили это -
http://cs.oswego.edu/pipermail/concurrency-interest/2010-December/007567.html
В данном случае это не имеет значения тк запись в поля идет до старта нового потока. Никаких сюрпизов тут нет просто нет.

Что и говорится в первом же ответе на это письмо
авторBut if you start the thread at the end of the constructor there is nothing
that can go wrong for this class - there is a happens-before edge between
starting a thread and execution of its run method. So no races and no
visibility issues: all state is fully initialized.
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38385633
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schwaВ данном случае это не имеет значения тк запись в поля идет до старта нового потока. Никаких сюрпизов тут нет просто нет.

В предоставленном коде проблемы нет, но еще раз - если класс не final, то есть потенциальная точка сбоя в будущем. Если это утилитный класс, который не выходит за пределы команды - то в принцие ок, если же представить что от этого кода кто-то может унаследоваться, то будет такая беда -

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
class Test2 extends Test {

int c;

public Test2() {
    super();
    c = 3;//бида-бида
}



Лично я считаю это багом. А вот если сделать Test final - то это будет хоть и не совсем красивый код, но зато железобетонный
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38627574
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а расскажите пожалуйста что такое "публикация" ? ну или хотя бы как это по английски называется? никак не могу понять о чем вообще речь.
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38627583
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerа расскажите пожалуйста что такое "публикация" ?
Делать что-то видимым со стороны. В случае многопоточности это писать инициализацию так, чтобы другие потоки всегда видели валидное "опубликованое" значение, а не результат не полной инициализации.

questionerну или хотя бы как это по английски называется?
safe publication, object publication. Иногда пишут publishing. Но, ИМХО, это реже.

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

оу, спасибо.

а самое тривиальное я так понимаю сделать ссылки на все поля этого объекта volatile?
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38627658
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerа самое тривиальное я так понимаю сделать ссылки на все поля этого объекта volatile?
Нет. Вариантов не безопасной публикации много. Поэтому просто сделать поля volatile недостаточно. Например ссыла на объект может утечь из конструктора и другие потоки могут получить её ещё до того как выполнение конструктора завершено. Volatile это никак не исправит.
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38627666
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

ммм....конструктор пометить synchronized ещё будет достаточно?
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38627669
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerммм....конструктор пометить synchronized ещё будет достаточно?
А теперь подумай над тем что ты написал. Хорошо подумай.
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38627702
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет это не безопасная публикация - не обеспечено точечное freeze happens before
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38627809
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

хм, IDEIllegal modifier for the constructor in type VolatileTest; only public, protected & private are permitted
ок. видимо нельзя синкаться по несуществующему объекту. Зато сделать секцию внутри конструктора по монитору this можно
а про "утечь". У нас есть конструктор. мы внутри него куда-то отдаем this в другой поток.

что-нить типа
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
Class A{
  A(){
      ...
      someThread.threadAField = this;
      somethread.start();
      ...
   }
}




такая ситуация?


Говоря о тривиальных решениях я вижу сделать внутри конструктора sync секуию и внутри метода run потока секцию по тому же монитору.


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

Кто-то реально заработался. Подсказываю. Какой практический смысл в синхронизации конструктора?
Два потока создают один и тот же объект? Это возможно?


questioner Зато сделать секцию внутри конструктора по монитору this можно

Нафига?

questionerа про "утечь". У нас есть конструктор. мы внутри него куда-то отдаем this в другой поток.

Тепло. Самая распространенная ситуация, это вновь созданый объект может где-то себя зарегистрировать из конструктора.
А другие потоки имеют доступ к этому "хранилищу".




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

Blazkowicz Подсказываю. Какой практический смысл в синхронизации конструктора?
Два потока создают один и тот же объект? Это возможно?
блин, и правда)

BlazkowiczНафига?
а шут его знает.... после осознания того, что BlazkowiczДва потока создают один и тот же объект? Это возможно? - нет. Эта конструкция вызывает вопросы.

BlazkowiczНе надо зацикливаться на синхронизации. Безопасная публикация это немного другая проблема.

то есть надо делать так, чтобы к моменты выполнения конструктора все филды уже были инициализированы ? например в блоках инициализации ? но и в них есть доступ к this...

Что же тогда делать?
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38627907
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerто есть надо делать так, чтобы к моменты выполнения конструктора все филды уже были инициализированы ? например в блоках инициализации ? но и в них есть доступ к this...

Нет. Надо делать так чтобы другие потоки не могли видеть объект до окончания его инициализации.
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #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
Вопрос на засыпку: это безопасная публикация или нет?
    #38632277
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buldozer01schwa пропущено...

Зачем нужен фриз, если есть старт потока, который создает hb по JMM?


hb не транзитивен с freeze hb
Это здесь не причем т.к. в коде this не утекает.
JMM гарантирует, что поток видит действия, которые были сделаны в потоке, который его стартовал (действия, сделанные до старта потока).
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38632287
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и вопрос на засыпку. А почему этот freeze не транзитивен с hb? Почему его определили именно так, а не сделали транзитивным?
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38632444
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schwaЭто здесь не причем т.к. в коде this не утекает.
JMM гарантирует, что поток видит действия, которые были сделаны в потоке, который его стартовал (действия, сделанные до старта потока).
Только есть нюанс - там явная публикация this до окончания инициализации.
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38633191
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевschwaЭто здесь не причем т.к. в коде this не утекает.
JMM гарантирует, что поток видит действия, которые были сделаны в потоке, который его стартовал (действия, сделанные до старта потока).
Только есть нюанс - там явная публикация this до окончания инициализации.
Запись в поля в данном случае будет до публикации ссылки т.к. между ними есть операция старта потока, для которой есть гарантии в JMM.
Какие есть основания полагать, что JMM имеет особую семантику не только для записей/чтений final полей, но и для старта потока в конструкторе?
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38633243
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schwaЗапись в поля в данном случае будет до публикации ссылки т.к. между ними есть операция старта потока, для которой есть гарантии в JMM.
Запись полей, это не "безопасная публикация".
IMHO объект "безопасно опубликован" тогда, когда помимо всего прочего, ни один читатель публикации не сможет обратиться к нему до завершения работы всей цепочки конструкторов.
В примере
Код: java
1.
2.
3.
4.
public Test() {
    this(1,2);
    new Thread(new MyRunnable(this)).start();
 }



Публикация безопасна для класса Test, но не для ... extends Test .
И гарантии по поводу старта потока здесь не причем.
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38633440
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев,

Вот только про extends изначально слов не было.

Это как спросить человека написать бинарный поиск по массиву интов, а потом сказать, что его код не работает т.к. у него не учтен случай переполнения. Хотите полный ответ? Давайте больше контекста.
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38633461
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schwaНу и вопрос на засыпку. А почему этот freeze не транзитивен с hb? Почему его определили именно так, а не сделали транзитивным?

Да и почему ?
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38633507
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Честно говоря, вообще странно рассуждать о транзитивности final HB. Ведь что такое final? Это просто отсечение всех значений переменной, которые она имела до выхода из конструктора.
То есть, если у нас есть int, которому мы в разное время работы программы присваивали значения [1, 2, 3, 4, 5], то согласно JMM обычное чтение этой переменной может вернуть [0, 1, 2, 3, 4, 5]. Если же, например, в конструкторе мы присваивали этому полю значения [1, 2, 3], а в момент выхода из конструктора эта переменная была достижима из final поля, и была равна 3, то теперь обычное чтение может вернуть [0, 1, 2, 3, 4, 5] - [0, 1, 2] = [3, 4, 5]. Все, на этом HB заканчивается. Его просто напросто не с чем "транзитивить".
...
Рейтинг: 0 / 0
Вопрос на засыпку: это безопасная публикация или нет?
    #38633537
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoachЧестно говоря, вообще странно рассуждать о транзитивности final HB. Ведь что такое final? Это просто отсечение всех значений переменной, которые она имела до выхода из конструктора.
То есть, если у нас есть int, которому мы в разное время работы программы присваивали значения [1, 2, 3, 4, 5], то согласно JMM обычное чтение этой переменной может вернуть [0, 1, 2, 3, 4, 5]. Если же, например, в конструкторе мы присваивали этому полю значения [1, 2, 3], а в момент выхода из конструктора эта переменная была достижима из final поля, и была равна 3, то теперь обычное чтение может вернуть [0, 1, 2, 3, 4, 5] - [0, 1, 2] = [3, 4, 5]. Все, на этом HB заканчивается. Его просто напросто не с чем "транзитивить".

А Вы почитайте JLS и попробуйте доказать что после применения всех dereferences and memory chain мы таки не увидим дефолтного значения в final

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


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