Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / volatile - "легковесная синхронизация"? / 16 сообщений из 16, страница 1 из 1
11.08.2013, 14:41:52
    #38362276
свеном
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
volatile - "легковесная синхронизация"?
Коллеги,

Приходилось ли вам сталкиваться с утверждением "volatile это легковесная синхронизация"? Если да, то:
1) Согласны ли в с этим утверждением?
2) Что значит "легковесная"? Что "полегчало" и относительно чего?
3) Что значит "синхронизация"? Что с чем синхронизируется?
...
Рейтинг: 0 / 0
11.08.2013, 15:21:45
    #38362306
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
volatile - "легковесная синхронизация"?
Ну тут отвечать надо начиная с 3 имхо, потому что это и есть корень всех недоразумений.


3) Синхронизация в общем смысле - это такой порядок выполнения двух потоков, при котором они будут иметь непротиворечивый взгляд на шаред память в некоторые четко определенные моменты. На мой взгляд ключевое слово synchronized в java - не самый лучший выбор, потому что оно не до конца отображает что в реальности происходит.

2) Те кто говорят легковесная думаю имеют ввиду что это "синхронизация"(читай непротиворечивый взгляд на какую то переменную) без локов

1) Весьма и весьма спорно, во-первых с помощью волатайл можно засинхронизировать всего лишь одну переменную, во-вторых по JMM очень трудно отследить когда именно произойдет эта "синхронизация" и произойдет ли вообще. Обойтись волатайлом можно лишь в простейших случаях вроде volatile boolean runned. Все остальное - хитрые трюки, и чтобы играть так надо обладать недюжинной компетенцией
...
Рейтинг: 0 / 0
11.08.2013, 17:14:16
    #38362367
schwa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
volatile - "легковесная синхронизация"?
Легчает из-за того, что не влечет за собой сериализации потоков исполнения.
...
Рейтинг: 0 / 0
11.08.2013, 17:24:19
    #38362370
chabapok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
volatile - "легковесная синхронизация"?
свеном,

если вы делаете
a = b+c+d
x = y+z

То эти две операции не зависят одна от другой, и проц может их выполнить одновременно, а jvm может переупорядочить. При этом вторая операция (условно) будет выполняется скорее чем первая. Таким образом вроде как получается, что они даже без переупорядочивания будут выполнены в обратном порядке. Как оно произойдет на практике - сказать нельзя, и может происходить по-разному от запуска к запуску.

пока вы делаете однопоточное приложение, это все вам без разницы и про это можно вообще не знать.

Но если вы из другого потока в это время юзаете значения "a" и "x", то внезапно может оказаться что x поменяется раньше, а вы на это не рассчитывали. Считаете что в "a" новое значение, но там все еще старое. То есть, из другого потока вообще порядок изменения переменных может выглядеть "перемешанным" относительно того, чего вам хотелось бы.

если вы делаете "a" и "x" волатильными, то их порядок, видимый из другого потока, приходит в норму. В данном случае - поменяется сначала "а" и только потом "х".

Тяжеловесная синхронизация - это делать запись и считывание внтри syncronized блока. В варианте с volatile "полегчает" время исполнения по сравнению с тяжеловесным случаем.

имеется в виду, что синхронизируется действительный порядок изменения с ожидаемым. При этом, в производительности вы немножко проигрываете.

Тяжелей волатиля схема "один писатель - много читателей", и еще тяжелей синхронизед.
...
Рейтинг: 0 / 0
11.08.2013, 18:43:56
    #38362398
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
volatile - "легковесная синхронизация"?
chabapokесли вы делаете "a" и "x" волатильными, то их порядок, видимый из другого потока, приходит в норму. В данном случае - поменяется сначала "а" и только потом "х".


Вообще довольно спорное утверждение, я не припоминаю ничего чтобы это гарантировало.
...
Рейтинг: 0 / 0
11.08.2013, 18:46:09
    #38362400
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
volatile - "легковесная синхронизация"?
chabapokТяжеловесная синхронизация - это делать запись и считывание внтри syncronized блока. В варианте с volatile "полегчает" время исполнения по сравнению с тяжеловесным случаем.


а CAS это что тогда?
...
Рейтинг: 0 / 0
11.08.2013, 20:10:17
    #38362436
свеном
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
volatile - "легковесная синхронизация"?
забыл никВообще довольно спорное утверждение, я не припоминаю ничего чтобы это гарантировало.Стоп, стоп, это главная гарантия volatile - волатильные сторы не реордеряться с любыми предыдущими сторами, даже с неволатильными.
...
Рейтинг: 0 / 0
11.08.2013, 20:20:35
    #38362444
schwa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
volatile - "легковесная синхронизация"?
забыл никchabapokесли вы делаете "a" и "x" волатильными, то их порядок, видимый из другого потока, приходит в норму. В данном случае - поменяется сначала "а" и только потом "х".


Вообще довольно спорное утверждение, я не припоминаю ничего чтобы это гарантировало.
Это гарантируется из-за того, что если a следует до x в порядке выполнения программы, то hb(a, x).
...
Рейтинг: 0 / 0
11.08.2013, 20:29:55
    #38362450
chabapok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
volatile - "легковесная синхронизация"?
ушел читать доки... docs.oracle.com/javase/specs/jvms/se5.0/html/Threads.doc.html#22258

а это не оно?:

забыл никLet action A be a use or assign by thread T on variable V, let action F be the load or store associated with A, and let action P be the read or write of V that corresponds to F. Similarly, let action B be a use or assign by thread T on variable W, let action G be the load or store associated with B, and let action Q be the read or write of W that corresponds to G. If A precedes B, then P must precede Q. (Less formally: operations on the master copies of volatile variables on behalf of a thread are performed by the main memory in exactly the order that the thread requested.)


непереводимая мешанина букв. И далее "менее формально: операции на мастер-копиях волатильных переменных выполняются в основной памяти, точном порядке, который прописан в потоке".


Насчет cas-а легко понять насколько он тяжел, зная как оно работает. - чтение и запись из памяти, с последующим сранением и зацикливанием. Фактически, он делает все то же, что делает волатил, плюс еще, возможно, несколько таких итераций. Причем, если несколько потоков это делают одновременно, то учасок памяти в котором хранится значение еще гуляет между кэшпамятью этих потоков (т.н. true sharing). Следовательно, cas немножко тяжелей volatile но легче "схемы один писатель-много читателей"
...
Рейтинг: 0 / 0
11.08.2013, 20:38:02
    #38362453
chabapok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
volatile - "легковесная синхронизация"?
свеномволатильные сторы не реордеряться с любыми предыдущими сторами, даже с неволатильными.

Помоему, "даже с неволатильными" у synchronized, а у волатильных такого нету. Но этот момент надо тоже преверить.
...
Рейтинг: 0 / 0
11.08.2013, 20:47:46
    #38362457
свеном
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
volatile - "легковесная синхронизация"?
chabapok,
Это изменеие было внесено в 1.5. Собственно, именно благодаря ему волатили приобрели вменяемый смысл в джаве.
...
Рейтинг: 0 / 0
11.08.2013, 21:01:41
    #38362467
chabapok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
volatile - "легковесная синхронизация"?
свеном,

да, с этим замечанием я погорячился. Сорри.
...
Рейтинг: 0 / 0
11.08.2013, 21:45:47
    #38362483
vimba
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
volatile - "легковесная синхронизация"?
забыл ник...
1) Весьма и весьма спорно, во-первых с помощью волатайл можно засинхронизировать всего лишь одну переменную...
запись в volatile happens before чтению поэтому через volatile можно засинхронизировать все изменения, а не только изменения переменной с данным модификатором:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
volatile int i = 0;
int j = 0;

thread1:
i = 1;
j = 1;

thread2:
while (i != 1) {
   System.out.println(j);
}


Если thread2 увидит что в i попала единица, то он так же увидит что и в j попала единица, хотя на j модификатор волатайл не указан.
...
Рейтинг: 0 / 0
11.08.2013, 21:54:03
    #38362489
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
volatile - "легковесная синхронизация"?
vimbaзабыл ник...
1) Весьма и весьма спорно, во-первых с помощью волатайл можно засинхронизировать всего лишь одну переменную...
запись в volatile happens before чтению поэтому через volatile можно засинхронизировать все изменения, а не только изменения переменной с данным модификатором:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
volatile int i = 0;
int j = 0;

thread1:
i = 1;
j = 1;

thread2:
while (i != 1) {
   System.out.println(j);
}


Если thread2 увидит что в i попала единица, то он так же увидит что и в j попала единица, хотя на j модификатор волатайл не указан.
Вы уверены что именно так? А не надо ли i=1 j=1 поменять местами?
...
Рейтинг: 0 / 0
11.08.2013, 21:56:26
    #38362494
свеном
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
volatile - "легковесная синхронизация"?
забыл ник,
Надо.
...
Рейтинг: 0 / 0
11.08.2013, 22:30:23
    #38362510
vimba
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
volatile - "легковесная синхронизация"?
забыл ник,

да точно опечатался:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
volatile int i = 0;
int j = 0;

thread1:
j = 1;
i = 1;


thread2:
while (i != 1) {
   System.out.println(j);
}
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / volatile - "легковесная синхронизация"? / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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