|
|
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
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); } } } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2013, 08:17 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
Прошу прощения. Вот: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2013, 08:19 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
DEVcoach, Публикация кого? a и b относительно потокобезопасности? Да, безопасная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2013, 09:59 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
maxkarПубликация кого? a и b относительно потокобезопасности? Да, безопасная.Публикация объекта Test во вновь создаваемый поток. То есть, увидит ли новый поток этот объект в гарантированно консистентном состоянии? Если да - почему? Нет - тоже почему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2013, 10:32 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
cdtyjvЕсли да - почему? А сам то как думаешь, могут ли две независимых переменных быть в консистентном состоянии если для доступа к ним не используются блокировки? Ведь изменить свойства a и b может любой класс из пакета. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2013, 12:35 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
Это называется не публикация(?). Я не вижу тут ни одного геттера. Насколько я понял - вопрос касается того, можно ли в конструкторе запускать новый поток, передавая ему this (и делать это последней строчкой в конструкторе). Если мы так делаем, никто не гарантирует, что run начнет выполняться после полной отработки конструктора. В результате MyRunnable будет какое-то время юзать не полностью сконструированый обьект. Это не вполне хорошо и в будущем (когда в код подобавляют функционала) может привести к багам. Но "сейчас", мне кажется, что это безопасно (правда бить себя кулаком в грудь не стану). Но лучше так не делать. автор могут ли две независимых переменных быть в консистентном состоянии если для доступа к ним не используются блокировки? Если говорить лишь о них, то в данном случае они happence-before, т.к. устанавливаются до создания потока, поэтому с этим должно быть все ок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2013, 12:51 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2013, 12:54 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев А сам то как думаешь, могут ли две независимых переменных быть в консистентном состоянии если для доступа к ним не используются блокировки? Ведь изменить свойства a и b может любой класс из пакета.Все никак не могу нормально сформулировать вопрос. Пробую еще раз: можем ли мы быть уверены, что увидим из MyRunnable.run() a = 1 и b = 2, при условии, что никто их не меняет? Гарантированно ли будет распечатано 3? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2013, 13:18 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
DEVcoachСергей Арсеньев А сам то как думаешь, могут ли две независимых переменных быть в консистентном состоянии если для доступа к ним не используются блокировки? Ведь изменить свойства a и b может любой класс из пакета.Все никак не могу нормально сформулировать вопрос. Пробую еще раз: можем ли мы быть уверены, что увидим из MyRunnable.run() a = 1 и b = 2, при условии, что никто их не меняет? Гарантированно ли будет распечатано 3? В данном случае да, особенно если сделать класс Test как final. Хотя конечно не стоит на это завязываться, но как я понял тут обсуждается именно теоретический аспект. Вот тут ребята из конкурренси-интерест обсудили это - http://cs.oswego.edu/pipermail/concurrency-interest/2010-December/007567.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2013, 14:43 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
забыл никВ данном случае да, особенно если сделать класс Test как final.А как final может повлиять здесь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2013, 14:49 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
DEVcoach, В этом примере никак, но если представить что это класс бибилиотечный - и кому-то вздумалось его заэкстендить - то быть беде скорее всего, почитайте по ссылке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2013, 14:56 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
забыл ник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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2013, 15:14 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
schwaВ данном случае это не имеет значения тк запись в поля идет до старта нового потока. Никаких сюрпизов тут нет просто нет. В предоставленном коде проблемы нет, но еще раз - если класс не final, то есть потенциальная точка сбоя в будущем. Если это утилитный класс, который не выходит за пределы команды - то в принцие ок, если же представить что от этого кода кто-то может унаследоваться, то будет такая беда - Код: java 1. 2. 3. 4. 5. 6. 7. 8. Лично я считаю это багом. А вот если сделать Test final - то это будет хоть и не совсем красивый код, но зато железобетонный ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2013, 16:01 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
а расскажите пожалуйста что такое "публикация" ? ну или хотя бы как это по английски называется? никак не могу понять о чем вообще речь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 11:49 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
questionerа расскажите пожалуйста что такое "публикация" ? Делать что-то видимым со стороны. В случае многопоточности это писать инициализацию так, чтобы другие потоки всегда видели валидное "опубликованое" значение, а не результат не полной инициализации. questionerну или хотя бы как это по английски называется? safe publication, object publication. Иногда пишут publishing. Но, ИМХО, это реже. questionerникак не могу понять о чем вообще речь. Мы создаём объект. Инициализируем его поля. Публикуем - делаем этот объект доступным другим потокам. Безопасная публикация гарантирует что все поля объекта в этот момент инициализированы и видимы другим потокам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 11:55 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, оу, спасибо. а самое тривиальное я так понимаю сделать ссылки на все поля этого объекта volatile? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 12:47 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
questionerа самое тривиальное я так понимаю сделать ссылки на все поля этого объекта volatile? Нет. Вариантов не безопасной публикации много. Поэтому просто сделать поля volatile недостаточно. Например ссыла на объект может утечь из конструктора и другие потоки могут получить её ещё до того как выполнение конструктора завершено. Volatile это никак не исправит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 12:54 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, ммм....конструктор пометить synchronized ещё будет достаточно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 13:02 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
questionerммм....конструктор пометить synchronized ещё будет достаточно? А теперь подумай над тем что ты написал. Хорошо подумай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 13:05 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
Нет это не безопасная публикация - не обеспечено точечное freeze happens before ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 13:35 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
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. такая ситуация? Говоря о тривиальных решениях я вижу сделать внутри конструктора sync секуию и внутри метода run потока секцию по тому же монитору. Но это попахивает гвонокодом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 15:03 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
buldozer01Нет это не безопасная публикация - не обеспечено точечное freeze happens before Зачем нужен фриз, если есть старт потока, который создает hb по JMM? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 15:03 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
questionerок. видимо нельзя синкаться по несуществующему объекту. Кто-то реально заработался. Подсказываю. Какой практический смысл в синхронизации конструктора? Два потока создают один и тот же объект? Это возможно? questioner Зато сделать секцию внутри конструктора по монитору this можно Нафига? questionerа про "утечь". У нас есть конструктор. мы внутри него куда-то отдаем this в другой поток. Тепло. Самая распространенная ситуация, это вновь созданый объект может где-то себя зарегистрировать из конструктора. А другие потоки имеют доступ к этому "хранилищу". questionerГоворя о тривиальных решениях я вижу сделать внутри конструктора sync секуию и внутри метода run потока секцию по тому же монитору. Не надо зацикливаться на синхронизации. Безопасная публикация это немного другая проблема. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 15:30 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Blazkowicz Подсказываю. Какой практический смысл в синхронизации конструктора? Два потока создают один и тот же объект? Это возможно? блин, и правда) BlazkowiczНафига? а шут его знает.... после осознания того, что BlazkowiczДва потока создают один и тот же объект? Это возможно? - нет. Эта конструкция вызывает вопросы. BlazkowiczНе надо зацикливаться на синхронизации. Безопасная публикация это немного другая проблема. то есть надо делать так, чтобы к моменты выполнения конструктора все филды уже были инициализированы ? например в блоках инициализации ? но и в них есть доступ к this... Что же тогда делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 15:54 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
questionerто есть надо делать так, чтобы к моменты выполнения конструктора все филды уже были инициализированы ? например в блоках инициализации ? но и в них есть доступ к this... Нет. Надо делать так чтобы другие потоки не могли видеть объект до окончания его инициализации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 16:10 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=176&tid=2127225]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
58ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
77ms |
get tp. blocked users: |
2ms |
| others: | 253ms |
| total: | 443ms |

| 0 / 0 |
