|
|
|
volatile - "легковесная синхронизация"?
|
|||
|---|---|---|---|
|
#18+
Коллеги, Приходилось ли вам сталкиваться с утверждением "volatile это легковесная синхронизация"? Если да, то: 1) Согласны ли в с этим утверждением? 2) Что значит "легковесная"? Что "полегчало" и относительно чего? 3) Что значит "синхронизация"? Что с чем синхронизируется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2013, 14:41:52 |
|
||
|
volatile - "легковесная синхронизация"?
|
|||
|---|---|---|---|
|
#18+
Ну тут отвечать надо начиная с 3 имхо, потому что это и есть корень всех недоразумений. 3) Синхронизация в общем смысле - это такой порядок выполнения двух потоков, при котором они будут иметь непротиворечивый взгляд на шаред память в некоторые четко определенные моменты. На мой взгляд ключевое слово synchronized в java - не самый лучший выбор, потому что оно не до конца отображает что в реальности происходит. 2) Те кто говорят легковесная думаю имеют ввиду что это "синхронизация"(читай непротиворечивый взгляд на какую то переменную) без локов 1) Весьма и весьма спорно, во-первых с помощью волатайл можно засинхронизировать всего лишь одну переменную, во-вторых по JMM очень трудно отследить когда именно произойдет эта "синхронизация" и произойдет ли вообще. Обойтись волатайлом можно лишь в простейших случаях вроде volatile boolean runned. Все остальное - хитрые трюки, и чтобы играть так надо обладать недюжинной компетенцией ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2013, 15:21:45 |
|
||
|
volatile - "легковесная синхронизация"?
|
|||
|---|---|---|---|
|
#18+
Легчает из-за того, что не влечет за собой сериализации потоков исполнения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2013, 17:14:16 |
|
||
|
volatile - "легковесная синхронизация"?
|
|||
|---|---|---|---|
|
#18+
свеном, если вы делаете a = b+c+d x = y+z То эти две операции не зависят одна от другой, и проц может их выполнить одновременно, а jvm может переупорядочить. При этом вторая операция (условно) будет выполняется скорее чем первая. Таким образом вроде как получается, что они даже без переупорядочивания будут выполнены в обратном порядке. Как оно произойдет на практике - сказать нельзя, и может происходить по-разному от запуска к запуску. пока вы делаете однопоточное приложение, это все вам без разницы и про это можно вообще не знать. Но если вы из другого потока в это время юзаете значения "a" и "x", то внезапно может оказаться что x поменяется раньше, а вы на это не рассчитывали. Считаете что в "a" новое значение, но там все еще старое. То есть, из другого потока вообще порядок изменения переменных может выглядеть "перемешанным" относительно того, чего вам хотелось бы. если вы делаете "a" и "x" волатильными, то их порядок, видимый из другого потока, приходит в норму. В данном случае - поменяется сначала "а" и только потом "х". Тяжеловесная синхронизация - это делать запись и считывание внтри syncronized блока. В варианте с volatile "полегчает" время исполнения по сравнению с тяжеловесным случаем. имеется в виду, что синхронизируется действительный порядок изменения с ожидаемым. При этом, в производительности вы немножко проигрываете. Тяжелей волатиля схема "один писатель - много читателей", и еще тяжелей синхронизед. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2013, 17:24:19 |
|
||
|
volatile - "легковесная синхронизация"?
|
|||
|---|---|---|---|
|
#18+
chabapokесли вы делаете "a" и "x" волатильными, то их порядок, видимый из другого потока, приходит в норму. В данном случае - поменяется сначала "а" и только потом "х". Вообще довольно спорное утверждение, я не припоминаю ничего чтобы это гарантировало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2013, 18:43:56 |
|
||
|
volatile - "легковесная синхронизация"?
|
|||
|---|---|---|---|
|
#18+
chabapokТяжеловесная синхронизация - это делать запись и считывание внтри syncronized блока. В варианте с volatile "полегчает" время исполнения по сравнению с тяжеловесным случаем. а CAS это что тогда? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2013, 18:46:09 |
|
||
|
volatile - "легковесная синхронизация"?
|
|||
|---|---|---|---|
|
#18+
забыл никВообще довольно спорное утверждение, я не припоминаю ничего чтобы это гарантировало.Стоп, стоп, это главная гарантия volatile - волатильные сторы не реордеряться с любыми предыдущими сторами, даже с неволатильными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2013, 20:10:17 |
|
||
|
volatile - "легковесная синхронизация"?
|
|||
|---|---|---|---|
|
#18+
забыл никchabapokесли вы делаете "a" и "x" волатильными, то их порядок, видимый из другого потока, приходит в норму. В данном случае - поменяется сначала "а" и только потом "х". Вообще довольно спорное утверждение, я не припоминаю ничего чтобы это гарантировало. Это гарантируется из-за того, что если a следует до x в порядке выполнения программы, то hb(a, x). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2013, 20:20:35 |
|
||
|
volatile - "легковесная синхронизация"?
|
|||
|---|---|---|---|
|
#18+
ушел читать доки... 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 но легче "схемы один писатель-много читателей" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2013, 20:29:55 |
|
||
|
volatile - "легковесная синхронизация"?
|
|||
|---|---|---|---|
|
#18+
свеномволатильные сторы не реордеряться с любыми предыдущими сторами, даже с неволатильными. Помоему, "даже с неволатильными" у synchronized, а у волатильных такого нету. Но этот момент надо тоже преверить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2013, 20:38:02 |
|
||
|
volatile - "легковесная синхронизация"?
|
|||
|---|---|---|---|
|
#18+
chabapok, Это изменеие было внесено в 1.5. Собственно, именно благодаря ему волатили приобрели вменяемый смысл в джаве. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2013, 20:47:46 |
|
||
|
volatile - "легковесная синхронизация"?
|
|||
|---|---|---|---|
|
#18+
свеном, да, с этим замечанием я погорячился. Сорри. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2013, 21:01:41 |
|
||
|
volatile - "легковесная синхронизация"?
|
|||
|---|---|---|---|
|
#18+
забыл ник... 1) Весьма и весьма спорно, во-первых с помощью волатайл можно засинхронизировать всего лишь одну переменную... запись в volatile happens before чтению поэтому через volatile можно засинхронизировать все изменения, а не только изменения переменной с данным модификатором: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Если thread2 увидит что в i попала единица, то он так же увидит что и в j попала единица, хотя на j модификатор волатайл не указан. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2013, 21:45:47 |
|
||
|
volatile - "легковесная синхронизация"?
|
|||
|---|---|---|---|
|
#18+
vimbaзабыл ник... 1) Весьма и весьма спорно, во-первых с помощью волатайл можно засинхронизировать всего лишь одну переменную... запись в volatile happens before чтению поэтому через volatile можно засинхронизировать все изменения, а не только изменения переменной с данным модификатором: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Если thread2 увидит что в i попала единица, то он так же увидит что и в j попала единица, хотя на j модификатор волатайл не указан. Вы уверены что именно так? А не надо ли i=1 j=1 поменять местами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2013, 21:54:03 |
|
||
|
volatile - "легковесная синхронизация"?
|
|||
|---|---|---|---|
|
#18+
забыл ник, Надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2013, 21:56:26 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38362457&tid=2128834]: |
0ms |
get settings: |
15ms |
get forum list: |
24ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
60ms |
get topic data: |
20ms |
get forum data: |
6ms |
get page messages: |
92ms |
get tp. blocked users: |
2ms |
| others: | 285ms |
| total: | 518ms |

| 0 / 0 |
