powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос на засыпку: это безопасная публикация или нет?
25 сообщений из 59, страница 1 из 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
25 сообщений из 59, страница 1 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос на засыпку: это безопасная публикация или нет?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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