|
|
|
concurrency in practice почему SafePoint threadSafe?
|
|||
|---|---|---|---|
|
#18+
В concurrency in practice пишут, что это thread safe class: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ещё есть сноска: concurrency in practiceThe private constructor exists to avoid the race condition that would occur if the copy constructor were implemented as this(p.x, p.y); this is an example of the private constructor capture idiom (Bloch and Gafter, 2005). Не понимаю почему класс thread-safe. Ведь после того как выставили значения x,y в конструкторе мы можем увидеть ссылку на объект в котором поля не полностью проинициализированы. не понял я зачем нужно 3! конструктора и один из них приватный. Какая race condition тут? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2017, 00:54 |
|
||
|
concurrency in practice почему SafePoint threadSafe?
|
|||
|---|---|---|---|
|
#18+
Да, это не thread safe будет в двух случаях: 1.простой конструктор safepoint(6, 6) и расшариваем без happens before 2. Copy конструктор new Safepoint(oldsafepoint) и расшариваем эту новую копию без happens before. Другое дело, что бы в java расшарить объект без happens before нужно специально постараться (если использовать стандартные коллекции конкаррент то там HB везде). Если бы копи конструктор без p.get() был а просто p.x p.y, то здесь нет HB между synchronized setxy и чтением обычных полей x y. Кароче, с той точки зрения с которой здесь обсуждали синглтон это не safe. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2017, 02:42 |
|
||
|
concurrency in practice почему SafePoint threadSafe?
|
|||
|---|---|---|---|
|
#18+
no56892, а зачем изобрели какое-то решение с приватным конструктором когда и так дырок хватает? он защищает от какой-то более очевидной проблемы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2017, 00:34 |
|
||
|
concurrency in practice почему SafePoint threadSafe?
|
|||
|---|---|---|---|
|
#18+
Непонятно зачем этот конструктор нужен. Мало того что в нем нет тривиальных проверок или asserts на array bounds но и сама мотивация использовать подобный код - сомнительна. Код: java 1. Вобщем не ходите дети в африку гулять. Не пишите так. Никогда не пишите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2017, 13:38 |
|
||
|
concurrency in practice почему SafePoint threadSafe?
|
|||
|---|---|---|---|
|
#18+
maytonНепонятно зачем этот конструктор нужен. Мало того что в нем нет тривиальных проверок или asserts на array bounds но и сама мотивация использовать подобный код - сомнительна. Код: java 1. Вобщем не ходите дети в африку гулять. Не пишите так. Никогда не пишите. понял таки зачем приватный конструктор: входная информация, которую подаёт автор это то, что он хочет конструктор копирования такого типа: Код: java 1. пока у нас есть только такой конструктор: Код: java 1. 2. 3. 4. и мы не хотим дублировать логику, и чтобы её не дублировать надо писать что-то типа: Код: java 1. 2. 3. 4. Но так нельзя, ибо this/super должен быть первой строкой конструктора. и чтобы решить эту проблему - делаем такой вот трюк: private constructor capture idiom Код: java 1. 2. а то почему здесь race condition нет это потому, что мы единожды забрали массив, а не два раза обращаемся к разным массивам. Но всё равно как-то неочевидно написано и опять же thread-safe почему он это называет - непонятно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2017, 21:37 |
|
||
|
concurrency in practice почему SafePoint threadSafe?
|
|||
|---|---|---|---|
|
#18+
автора то почему здесь race condition нет это потому, что мы единожды забрали массив, а не два раза обращаемся к разным массивам. Но всё равно как-то неочевидно написано и опять же thread-safe почему он это называет - непонятно Data race нет, т.к. есть hb между set/get, а не то, что массив "единожды забираем". А почему Threadsafe назвали - имхо, потому, что предполагается, что читатель будет объекты расшаривать через hb. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2017, 23:33 |
|
||
|
concurrency in practice почему SafePoint threadSafe?
|
|||
|---|---|---|---|
|
#18+
no56892, а зачем тогда вообще вся эта история с массивом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2017, 09:33 |
|
||
|
concurrency in practice почему SafePoint threadSafe?
|
|||
|---|---|---|---|
|
#18+
no56892Data race нет, т.к. есть hb между set/get, А где в приведенном коде вызов этого set? Даже public SafePoint(int x, int y) сделано без оного. Публикация безопасна, если get будет иметь hb к конструктору. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2017, 10:24 |
|
||
|
concurrency in practice почему SafePoint threadSafe?
|
|||
|---|---|---|---|
|
#18+
questionerа зачем тогда вообще вся эта история с массивом? Это консистентное копирование. Суть в нем. Если бы было this.x=p.x; this.y=p.y; То, возможно, x и y достались бы от разных точек. Поэтому забираются только парой - через get. Собственно это логичное обоснование для x и y быть приватными с доступом, через сеттер/геттер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2017, 10:35 |
|
||
|
concurrency in practice почему SafePoint threadSafe?
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньевno56892Data race нет, т.к. есть hb между set/get, А где в приведенном коде вызов этого set? Даже public SafePoint(int x, int y) сделано без оного. Публикация безопасна, если get будет иметь hb к конструктору. Ну вот так Код: java 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2017, 20:42 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39403221&tid=2123153]: |
0ms |
get settings: |
5ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
65ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
| others: | 199ms |
| total: | 350ms |

| 0 / 0 |
