|
|
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#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 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
questionerто есть надо делать так, чтобы к моменты выполнения конструктора все филды уже были инициализированы ? А нафиг тогда конструктор? :) А еще есть @PostConstruct ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 16:21 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczНет. Надо делать так чтобы другие потоки не могли видеть объект до окончания его инициализации. Т.е. конструкторы только private, а генератор через статику, коя есть зло если верить соседнему треду. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 16:24 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев Т.е. конструкторы только private Видимость конструтора на публикацию не влияет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 16:29 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, BlazkowiczНет. Надо делать так чтобы другие потоки не могли видеть объект до окончания его инициализации. Я читаю это следующим образом: -как выкопать картошку ? -Чтобы выкопать картошку надо выкопать картошку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 16:34 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
questionerЯ читаю это следующим образом: -как выкопать картошку ? -Чтобы выкопать картошку надо выкопать картошку. Бывает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 16:36 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, судя по всему просто не надо в конструкторе ничего такого делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 16:53 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньевquestionerто есть надо делать так, чтобы к моменты выполнения конструктора все филды уже были инициализированы ? А нафиг тогда конструктор? :) А еще есть @PostConstruct я думал такое только в спринге есть) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 18:50 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
questionerа самое тривиальное я так понимаю сделать ссылки на все поля этого объекта volatile?volatile поля внутри объекта не помогут. А вот если вы сделаете ссылку, которой присваиваете вновь созданный объект volatile, то тогда опубликуете его безопасно, даже без final полей внутри класса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 20:42 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
DEVcoach, и публиковать уже только тогда, когда объект полностью сконструирован? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 21:43 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
redwhite90и публиковать уже только тогда, когда объект полностью сконструирован?Не совсем понял ваш вопрос. Поясните, пожалуйста. volatile-запись гарантирует, что все операции, следовавшие в коде до нее будут видны к тому моменту, как станет видна эта запись. То есть, если у нас есть класс: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. И где-то есть вот такая декларация: Код: java 1. То вот такая публикация всегда будет безопасной: Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 22:11 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
DEVcoach, DEVcoachНе совсем понял ваш вопрос. Поясните, пожалуйста. я имел ввиду такую ситуацию. Код: java 1. 2. 3. 4. 5. 6. 7. 8. DEVcoachТо вот такая публикация всегда будет безопасной: Код: java 1. никак до конца воткнуть не могу. конкретно тут фраза DEVcoachТо вот такая публикация всегда будет безопасной значит что a.field1 и a.field2 гарантированно выдадут 1 и 2. неужели может быть иначе? контр-пример был бы показателен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 00:01 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
redwhite90 , Да, без volatile и без final они могут быть 0. Показать пример такого кода сложно, так как это надо, что бы JIT зареордерил эти инструкции. Когда он это делает - хз. За ответом надо идти к Шипилеву/Куксенко. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 07:12 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
DEVcoach redwhite90 , Да, без volatile и без final они могут быть 0. Показать пример такого кода сложно, так как это надо, что бы JIT зареордерил эти инструкции. Когда он это делает - хз. За ответом надо идти к Шипилеву/Куксенко. DEVcoach , Вы запутались, понятно про volatile поля обьекта и приводили примеры, а здесь у вас volatile A a, и тогда причем реордер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 09:09 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
0FDDEVcoach , Вы запутались, понятно про volatile поля обьекта и приводили примеры, а здесь у вас volatile A a, и тогда причем реордер.Вопрос звучал так: redwhite90значит что a.field1 и a.field2 гарантированно выдадут 1 и 2. неужели может быть иначе? контр-пример был бы показателен.Ответ приведен выше: да, может, если объект публикуется на в volatile ссылку, и если его поля не final. В чем я запутался? :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 09:38 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
DEVcoachОтвет приведен выше: да, может, если объект публикуется на в volatile ссылку, и если его поля не final. В чем я запутался? :-) Выходит что не-volatile ссылка инициализируется до конструирования обьекта? выделили памать, а дальше, где-то, вызов конструктора, выходит даже в том же потоке есть вероятность получить несконструированный обьект из-за реордера? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 09:58 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
0FD , В том же потоке нельзя, так как есть happens-before между всеми соседними операциями. А с другого потока можно увидеть не до конца сконструированный объект. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 10:14 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
DEVcoach 0FD , В том же потоке нельзя, так как есть happens-before между всеми соседними операциями. А с другого потока можно увидеть не до конца сконструированный объект. Выходит, что ссылка инициализируется только после вызова конструктора в потоке, а как же тогда другой поток увидет ссылку, которая инициализирована до вызова конструктора? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 10:23 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
DEVcoach, А не, ссылка на обьект, до вызова конструктора, это нормально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 10:45 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
0FD , Ну это мы возвращаемся к основам JMM и архитектуре современных компьютеров :-) Поток может легко переставить инициализацию ссылки адресом созданного объекта до инициализации всех его полей - это не поломает логику кода в этом потоке. Но если другие потоки увидят эти операции в другом порядке, то это может их "озадачить". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 10:53 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
DEVcoach 0FD , Поток может легко переставить инициализацию ссылки адресом созданного объекта до инициализации всех его полей. тут явно с падежами что-то не то ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 11:04 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
Да просто тут как 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 в первом потоке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 13:42 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
Сложность возникает с публикацией из конструктора. В конструкторе (если он не default и private) при создании потомка, нет момента когда инициализация закончена, и опубликование безопасно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 13:46 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
Я конечно против такого подхода, но Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. И что-то я не понял - куда ни глянешь, все паттерны обсуждают, а тут почему-то забыли зачем нужны фабричные методы и пр. Впрчем я видел код, где из конструктора вообще вся обработка вызывается, включая несколько коннектов к разным БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 14:26 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
schwa buldozer01Нет это не безопасная публикация - не обеспечено точечное freeze happens before Зачем нужен фриз, если есть старт потока, который создает hb по JMM? hb не транзитивен с freeze hb ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 14:53 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
buldozer01, а что за freeze вообще? как-то не особо гуглится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2014, 23:00 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
buldozer01schwa пропущено... Зачем нужен фриз, если есть старт потока, который создает hb по JMM? hb не транзитивен с freeze hb Это здесь не причем т.к. в коде this не утекает. JMM гарантирует, что поток видит действия, которые были сделаны в потоке, который его стартовал (действия, сделанные до старта потока). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2014, 12:07 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
Ну и вопрос на засыпку. А почему этот freeze не транзитивен с hb? Почему его определили именно так, а не сделали транзитивным? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2014, 12:21 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
schwaЭто здесь не причем т.к. в коде this не утекает. JMM гарантирует, что поток видит действия, которые были сделаны в потоке, который его стартовал (действия, сделанные до старта потока). Только есть нюанс - там явная публикация this до окончания инициализации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2014, 17:03 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевschwaЭто здесь не причем т.к. в коде this не утекает. JMM гарантирует, что поток видит действия, которые были сделаны в потоке, который его стартовал (действия, сделанные до старта потока). Только есть нюанс - там явная публикация this до окончания инициализации. Запись в поля в данном случае будет до публикации ссылки т.к. между ними есть операция старта потока, для которой есть гарантии в JMM. Какие есть основания полагать, что JMM имеет особую семантику не только для записей/чтений final полей, но и для старта потока в конструкторе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2014, 13:38 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
schwaЗапись в поля в данном случае будет до публикации ссылки т.к. между ними есть операция старта потока, для которой есть гарантии в JMM. Запись полей, это не "безопасная публикация". IMHO объект "безопасно опубликован" тогда, когда помимо всего прочего, ни один читатель публикации не сможет обратиться к нему до завершения работы всей цепочки конструкторов. В примере Код: java 1. 2. 3. 4. Публикация безопасна для класса Test, но не для ... extends Test . И гарантии по поводу старта потока здесь не причем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2014, 14:07 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев, Вот только про extends изначально слов не было. Это как спросить человека написать бинарный поиск по массиву интов, а потом сказать, что его код не работает т.к. у него не учтен случай переполнения. Хотите полный ответ? Давайте больше контекста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2014, 15:58 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
schwaНу и вопрос на засыпку. А почему этот freeze не транзитивен с hb? Почему его определили именно так, а не сделали транзитивным? Да и почему ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2014, 16:11 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
Честно говоря, вообще странно рассуждать о транзитивности 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 заканчивается. Его просто напросто не с чем "транзитивить". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2014, 16:35 |
|
||
|
Вопрос на засыпку: это безопасная публикация или нет?
|
|||
|---|---|---|---|
|
#18+
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 Я так и не доказал это ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2014, 16:50 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2127225]: |
0ms |
get settings: |
11ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
160ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
114ms |
get tp. blocked users: |
2ms |
| others: | 243ms |
| total: | 573ms |

| 0 / 0 |
