powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Java. Вопросы по многопоточности
6 сообщений из 31, страница 2 из 2
Java. Вопросы по многопоточности
    #39294588
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевЧто sync, что volatile, что atomic с точки зрения JMM ставят барьер (грань happens before) и jvm должна гарантировать, что изменения сделанные в потоке A до этого барьера (записи ссылки) должны быть видны в потоке B после этого барьера (чтения ссылки).

IMHO Первая часть Вашего ответа, противоречит второй.

IMHO & AFAIK. Volatile гарантирует, что данная _атомарная_ переменная/ссылка, будет корректна видна. Но не гарантирует, что другие данные будут корректно видны. Т.е. такой себе "мини-барьер" который нисколько гонкам по другим данным не препятствует.

Сергей Арсеньев
Однако, если ссылка остается прежней, а меняется содержимое, то в потоке B нельзя гарантировать, что он не прочел старое значение ссылки (то же самое) и потому барьер на него может не распространяться.
А можно как-то JVM "более легким" образом (чем syncronized) сказать, что нужен барьер распространяющийся на все действия которые были проведены внутри потока (т.е. выкинуть данные объекта и всего остального дерева объектов которые внутри него)?

Использовать synchronized в качестве барьера, когда мне реального Lock'а не требуется, достаточно "сурово". Использовать Lock, когда опять таки, мне лока не требуется так же. IMHO
...
Рейтинг: 0 / 0
Java. Вопросы по многопоточности
    #39294605
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev[
IMHO & AFAIK. Volatile гарантирует, что данная _атомарная_ переменная/ссылка, будет корректна видна. Но не гарантирует, что другие данные будут корректно видны. Т.е. такой себе "мини-барьер" который нисколько гонкам по другим данным не препятствует.

Еще раз по шагам.
Грань h-b выставляемая записью в volatile позволит после чтения правильно прочитать то, что было до записи volatile. Если объект, на который указывает ссылка, не менялся после записи volatile. Если менялся - то никаких гарантий. Или если другой поток получил ссылку не через volatile.
...
Рейтинг: 0 / 0
Java. Вопросы по многопоточности
    #39294644
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевLeonid Kudryavtsev[
IMHO & AFAIK. Volatile гарантирует, что данная _атомарная_ переменная/ссылка, будет корректна видна. Но не гарантирует, что другие данные будут корректно видны. Т.е. такой себе "мини-барьер" который нисколько гонкам по другим данным не препятствует.

Еще раз по шагам.
Грань h-b выставляемая записью в volatile позволит после чтения правильно прочитать то, что было до записи volatile. Если объект, на который указывает ссылка, не менялся после записи volatile. Если менялся - то никаких гарантий. Или если другой поток получил ссылку не через volatile.

То есть, все данные внутри экземпляра объекта, в том числе, если поля внутри объекта не объявлены как "volatile" ?

Пока на практике наблюдаю другое. Создаю объект, помещаю в AtomicReference (тот же volatile) потом про данный объект забывает, другой поток забирает из AtomicReference, периодически объект приходит не консистентным.

Ошибка в моем коде не исключена. Т.ч. могу быть не прав. Но пока складывалось чувство, что volatile & AtomicReference не гарантирует консистентнось данных внутри помещенного туда экземпляра.
...
Рейтинг: 0 / 0
Java. Вопросы по многопоточности
    #39294959
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевГрань 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.
volatile int z=0;
MyCoolObj obj;


//поток 1
obj = new MyCoolObj();
z = 1;


//поток 2
if (z==1){
//тут obj будет виден
}
...
Рейтинг: 0 / 0
Java. Вопросы по многопоточности
    #39294995
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slipperyДобрый день, уважаемые гуру многопоточного программирование. Если Вас не затруднит, ответьте пожалуйста на несколько вопросов:

1 К примеру у меня есть какой-то объект типа Object многопоточное чтение которого происходит гораздо чаще, чем модификация и есть два варианта реализации:

a) обычная переменная Object obj и ReadWriteLock соответственно на методы чтения и модификации

б) volatile Object obj, на метод модификации - простой Lock, создание нового объекта и замены ссылки obj. МGетод чтения без синхронизации(не считая записи-чтения volatile переменной)

Какой из вариантов предпочтительнее и будет работать быстрее и почему?

2 Если я решил делать вариант 1.б и точно знаю, что мое приложение будет запускаться на сервере с несколькими процессорами архитектуры X86-64, то мог ли я вообще убрать volatile и нарушив тем самым JMM, но полагаясь на протоколы когерентности кешей процессоров? прочитает ли ядро 2го процессора измененые данные в ядре первого и даст ли это хоть какой-то прирост производительности?
1. Если чтений много, а изменений мало - StampedLock (
YouTube Video
...
Рейтинг: 0 / 0
Java. Вопросы по многопоточности
    #39294997
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
читать как:
just_vladimirто все манипуляции из первого потока , выполненные до момента публикации объекта, обязаны быть видны второму потоку, ибо JMM.
...
Рейтинг: 0 / 0
6 сообщений из 31, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Java. Вопросы по многопоточности
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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