|
|
|
Java. Вопросы по многопоточности
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевЧто sync, что volatile, что atomic с точки зрения JMM ставят барьер (грань happens before) и jvm должна гарантировать, что изменения сделанные в потоке A до этого барьера (записи ссылки) должны быть видны в потоке B после этого барьера (чтения ссылки). IMHO Первая часть Вашего ответа, противоречит второй. IMHO & AFAIK. Volatile гарантирует, что данная _атомарная_ переменная/ссылка, будет корректна видна. Но не гарантирует, что другие данные будут корректно видны. Т.е. такой себе "мини-барьер" который нисколько гонкам по другим данным не препятствует. Сергей Арсеньев Однако, если ссылка остается прежней, а меняется содержимое, то в потоке B нельзя гарантировать, что он не прочел старое значение ссылки (то же самое) и потому барьер на него может не распространяться. А можно как-то JVM "более легким" образом (чем syncronized) сказать, что нужен барьер распространяющийся на все действия которые были проведены внутри потока (т.е. выкинуть данные объекта и всего остального дерева объектов которые внутри него)? Использовать synchronized в качестве барьера, когда мне реального Lock'а не требуется, достаточно "сурово". Использовать Lock, когда опять таки, мне лока не требуется так же. IMHO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2016, 13:50 |
|
||
|
Java. Вопросы по многопоточности
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev[ IMHO & AFAIK. Volatile гарантирует, что данная _атомарная_ переменная/ссылка, будет корректна видна. Но не гарантирует, что другие данные будут корректно видны. Т.е. такой себе "мини-барьер" который нисколько гонкам по другим данным не препятствует. Еще раз по шагам. Грань h-b выставляемая записью в volatile позволит после чтения правильно прочитать то, что было до записи volatile. Если объект, на который указывает ссылка, не менялся после записи volatile. Если менялся - то никаких гарантий. Или если другой поток получил ссылку не через volatile. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2016, 14:05 |
|
||
|
Java. Вопросы по многопоточности
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевLeonid Kudryavtsev[ IMHO & AFAIK. Volatile гарантирует, что данная _атомарная_ переменная/ссылка, будет корректна видна. Но не гарантирует, что другие данные будут корректно видны. Т.е. такой себе "мини-барьер" который нисколько гонкам по другим данным не препятствует. Еще раз по шагам. Грань h-b выставляемая записью в volatile позволит после чтения правильно прочитать то, что было до записи volatile. Если объект, на который указывает ссылка, не менялся после записи volatile. Если менялся - то никаких гарантий. Или если другой поток получил ссылку не через volatile. То есть, все данные внутри экземпляра объекта, в том числе, если поля внутри объекта не объявлены как "volatile" ? Пока на практике наблюдаю другое. Создаю объект, помещаю в AtomicReference (тот же volatile) потом про данный объект забывает, другой поток забирает из AtomicReference, периодически объект приходит не консистентным. Ошибка в моем коде не исключена. Т.ч. могу быть не прав. Но пока складывалось чувство, что volatile & AtomicReference не гарантирует консистентнось данных внутри помещенного туда экземпляра. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2016, 14:58 |
|
||
|
Java. Вопросы по многопоточности
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевГрань h-b выставляемая записью в volatile позволит после чтения правильно прочитать то, что было до записи volatile. Если объект, на который указывает ссылка, не менялся после записи volatile. Если менялся - то никаких гарантий. Или если другой поток получил ссылку не через volatile. Ну да. Если мы поменяли поля объекта после volatile write, то в другом потоке эти поля либо прочитаются непоменяными, либо поменяными (или частично, в случайном порядке). Чтобы их прочитать все гарантировано, нужен еще 1 volatile write в одном потоке и volatile read в другом. Причем, необязательно, чтоб это был vw/vr на ссылке этого обьекта. Можно на любой другой переменной. Насчет выделенного. Неважно как другой поток получает ссылку. Важно что был vw/vr на одной переменной. После этого поток, сделавший vr видит все, что было в другом потоке до vw в эту же переменную. можно так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2016, 15:39 |
|
||
|
Java. Вопросы по многопоточности
|
|||
|---|---|---|---|
|
#18+
slipperyДобрый день, уважаемые гуру многопоточного программирование. Если Вас не затруднит, ответьте пожалуйста на несколько вопросов: 1 К примеру у меня есть какой-то объект типа Object многопоточное чтение которого происходит гораздо чаще, чем модификация и есть два варианта реализации: a) обычная переменная Object obj и ReadWriteLock соответственно на методы чтения и модификации б) volatile Object obj, на метод модификации - простой Lock, создание нового объекта и замены ссылки obj. МGетод чтения без синхронизации(не считая записи-чтения volatile переменной) Какой из вариантов предпочтительнее и будет работать быстрее и почему? 2 Если я решил делать вариант 1.б и точно знаю, что мое приложение будет запускаться на сервере с несколькими процессорами архитектуры X86-64, то мог ли я вообще убрать volatile и нарушив тем самым JMM, но полагаясь на протоколы когерентности кешей процессоров? прочитает ли ядро 2го процессора измененые данные в ядре первого и даст ли это хоть какой-то прирост производительности? 1. Если чтений много, а изменений мало - StampedLock ( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2016, 19:16 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39294605&tid=2123800]: |
0ms |
get settings: |
8ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
60ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
| others: | 212ms |
| total: | 370ms |

| 0 / 0 |
