|
|
|
Правда ли, что volatile медленные и "не кэшируются"?
|
|||
|---|---|---|---|
|
#18+
Собственно, сабж. Кто что думает по этому поводу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 11:22:21 |
|
||
|
Правда ли, что volatile медленные и "не кэшируются"?
|
|||
|---|---|---|---|
|
#18+
Правда ли что Java тормозит? Что появилось раньше яйцо или курица? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 11:31:48 |
|
||
|
Правда ли, что volatile медленные и "не кэшируются"?
|
|||
|---|---|---|---|
|
#18+
Volatile переменные The Java Virtual Machine Specification, Java SE 5.0 / SE 6 Edition The Java Virtual Machine Specification, Java SE 7 Edition ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 11:56:57 |
|
||
|
Правда ли, что volatile медленные и "не кэшируются"?
|
|||
|---|---|---|---|
|
#18+
DEVcoachСобственно, сабж. Кто что думает по этому поводу? Всё очень сильно зависит от - Реализации JVM - Платформы - Количестве записей\чтения volatile поля и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 12:02:25 |
|
||
|
Правда ли, что volatile медленные и "не кэшируются"?
|
|||
|---|---|---|---|
|
#18+
по сравнению с обычными переменными волатиле медленей, а по сравнению с доступом через synchronized - волатиле быстрей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2013, 10:53:34 |
|
||
|
Правда ли, что volatile медленные и "не кэшируются"?
|
|||
|---|---|---|---|
|
#18+
chabapokпо сравнению с обычными переменными волатиле медленей, а по сравнению с доступом через synchronized - волатиле быстрей.Достаточно спорное утверждение. Во-первых, synchronized и volatile решают принципиально разные задачи. synchronized - это и видимость, и критическая секция. volatile - только видимость при условии, что чтение идет после записи. Во-вторых, частных случаях volatile иожет быть, как таким же по скорости, как и обычная переменная, так и медленнее, чем synchronized. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2013, 11:36:57 |
|
||
|
Правда ли, что volatile медленные и "не кэшируются"?
|
|||
|---|---|---|---|
|
#18+
DEVcoach, Если у вас есть свое мнение, с которым вы согласны, то зачем было спрашивать такие вопросы? не пойму. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2013, 12:53:29 |
|
||
|
Правда ли, что volatile медленные и "не кэшируются"?
|
|||
|---|---|---|---|
|
#18+
DEVcoachchabapokпо сравнению с обычными переменными волатиле медленей, а по сравнению с доступом через synchronized - волатиле быстрей.Достаточно спорное утверждение. Во-первых, synchronized и volatile решают принципиально разные задачи. synchronized - это и видимость, и критическая секция. volatile - только видимость при условии, что чтение идет после записи. Во-вторых, частных случаях volatile иожет быть, как таким же по скорости, как и обычная переменная, так и медленнее, чем synchronized. ну как бе все равно "синхронизация" в volatile присутствует при записи в нее (и чтении) с разных потоков, хоть и расходы на нее гоооораздо меньшие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2013, 17:08:09 |
|
||
|
Правда ли, что volatile медленные и "не кэшируются"?
|
|||
|---|---|---|---|
|
#18+
Посмотрите доклад с JavaOne 2013 от наших соотечественников из Oracle занимающихся бенчмаркингом (Сергей Куксенко & Алексей Шипилев), я к сожалению не помню в каком именно из докладов, но точно есть сравнение обычных и volatile. Если в кратце, то вывод такой - они не медленные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2013, 18:13:03 |
|
||
|
Правда ли, что volatile медленные и "не кэшируются"?
|
|||
|---|---|---|---|
|
#18+
just_vladimir, А я писал свой ответ ему как раз по мотивам того видео. Там еще интересно было про атомики и про фелс шаринги. Но внезапно топикстартер мне завозражал, без приведения каких бы то ни было внятных аргументов. Ну, раз у него за сутки уже сформировалось собственное мнение - не вижу причин оспаривать. У нас ведь демократия: каждый решает сам во что ему верить, а во что нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2013, 12:50:00 |
|
||
|
Правда ли, что volatile медленные и "не кэшируются"?
|
|||
|---|---|---|---|
|
#18+
chabapokНо внезапно топикстартер мне завозражал, без приведения каких бы то ни было внятных аргументов. Ну, раз у него за сутки уже сформировалось собственное мнение - не вижу причин оспаривать. У нас ведь демократия: каждый решает сам во что ему верить, а во что нет.Я лишь указал, что ваша позиция неверна в общем случае . Почему? 1) Накладные расходы на synchronized могут быть большими (обычный монитор), маленькими (biased locking), или вовсе нулевыми (он может быть полностью проигнорирован JVM). 2) Накладные расходы на volatille могут быть большими (много пишем), средними (много читаем, редко пишем), или опять таки нулевыми (когда JVM знает, что в нее уже больше никто не будет писать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2013, 13:33:07 |
|
||
|
Правда ли, что volatile медленные и "не кэшируются"?
|
|||
|---|---|---|---|
|
#18+
DEVcoach, 1. У вас понятия "большие", "маленькие", "нулевые" не согласованы между пунктами 1 и 2, а работают только внутри пункта. автор...(он может быть полностью проигнорирован JVM). 2. По умолчанию подразумевается ситуация, когда сущности, которые использовал программист, действительно необходимы, и поэтому не могут быть элиминированы jit-ом. Если мы этого не делаем, то можно вообще сказать, что стандартом это не регламентируется, поэтому можно сделать jvm в которой все наоборот с производительностью. 3. Похоже вы вообще сравниваете непонятно что непонятно с чем. Сравнивать имеет смысл логически идентичные конструкции которые можно реализовать обеими методами. То есть, если мы захотели пристально смотреть на случай "мало пишем, но много читаем", то давайте смотреть что будет, если мы сделаем это через synchronized. Представьте себе тормоза которые начнутся, если мы каждое чтение волтилей начнем заменять на конструкции внутри synchronized. Даже если там будет biased-locking, без уходов в ядро ос, все равно это взаимоисключающее исполнение, против одновременного при волатилях. в том видео, что упоминалось, говорили, что на х86 чтение волатилей почти эквивалентно чтению обычной переменной, но на других архитектурах это может быть не так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2013, 11:24:45 |
|
||
|
Правда ли, что volatile медленные и "не кэшируются"?
|
|||
|---|---|---|---|
|
#18+
chabapok , честно говоря, до конца не уловил вашей мысли в данном посте. Отмечу лишь следущее: 1) "Бесплатными" на x86 являются не чтения, а записи volatile, так как эта архитектура следует TSO, а потому выставлять барьеры при записи не нужно. Единственный барьер, который реально выставляется у volatile на x86, это StoreLoad, то есть чтение-после-записи. Все остальные барьеры на x86 вырождаются в nop. Больше информации здесь: http://g.oswego.edu/dl/jmm/cookbook.html 2) Как я уже писал выше, ставить в один ряд synchronized и volatile в принципе не корректно, так как они решают разные задачи. synchronized - это и mutex, и видимость, volatile - только видимость. Поэтому некорректным является именно ваш изначальный пост, где вы стали сравнивать synchronized и volatile. Моя же ошибка заключается в том, что я начал развивать этот спор. Поэтому я предлагаю выкинуть synchronized из поля зрения в принципе, как сущность, не относящуюся к теме топика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2013, 11:44:35 |
|
||
|
Правда ли, что volatile медленные и "не кэшируются"?
|
|||
|---|---|---|---|
|
#18+
DEVcoach, у тебя есть какой-нибудь бенчмарк или юзкейс чтобы мы могли пообсуждать более предметно? Возможно volatile - это тот самый пингвин которого ты "не умеешь готовить" или применяешь "не там и не в то время". Это кст. типичная ошибка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2013, 12:55:57 |
|
||
|
Правда ли, что volatile медленные и "не кэшируются"?
|
|||
|---|---|---|---|
|
#18+
mayton , Ну с volatile очень тяжело найти хоть какой-то пример, который что-то продемонстрирует на x86. В этом та и вся проблема, почему его плохо понимают - практически невозможно увидеть глазами результаты от его наличия или отсутствия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2013, 13:15:24 |
|
||
|
Правда ли, что volatile медленные и "не кэшируются"?
|
|||
|---|---|---|---|
|
#18+
DEVcoach mayton , Ну с volatile очень тяжело найти хоть какой-то пример, который что-то продемонстрирует на x86. В этом та и вся проблема, почему его плохо понимают - практически невозможно увидеть глазами результаты от его наличия или отсутствия. Тогда извини, я рискну предположить что volatile тебе не нужен. Или у тебя нет задач которые требуют использования volatile. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2013, 13:37:55 |
|
||
|
Правда ли, что volatile медленные и "не кэшируются"?
|
|||
|---|---|---|---|
|
#18+
maytonТогда извини, я рискну предположить что volatile тебе не нужен. Или у тебя нет задач которые требуют использования volatile.Как вы пришли к такому выводу? Мой вопрос был сугубо теоретический. И то, что эффект от использования volatile на x86 сложно увидеть, вовсе не означает, что их не надо использовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2013, 14:08:56 |
|
||
|
Правда ли, что volatile медленные и "не кэшируются"?
|
|||
|---|---|---|---|
|
#18+
В теории конечно всё интересно. Но мы будем обмениваться мнениями и цитатами из документов и спецификаций. В некотором варианте мы здесь должны рисовать графы со стрелочками и с барьерами и матрицы достижимости. Но я склоняюсь к выводу что программинг это всё-таки более практическая наука. Тоесть если я создал какой-то тест-кейс в котором доказал что volatile работает вовсе на так как пишет теория (в какой-то реализации JVM для какого-то мобильного телефона Samsung SE) то значит я эту всю теорию разгромил и нам надо вернуться к началу и спросить а какие собственно будут условия? Тоесть я возвращаюсь наверх и спрашиваю. DEVcoach. Каковы наши начальные условия? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2013, 14:31:32 |
|
||
|
Правда ли, что volatile медленные и "не кэшируются"?
|
|||
|---|---|---|---|
|
#18+
mayton , Коллега, я не могу понять, что вы от меня хотите. Был задан сугубо теоретический вопрос, с помощью которого я хотел понять, как люди видят volatile. Точка. Нет никаких "условий". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2013, 15:30:28 |
|
||
|
Правда ли, что volatile медленные и "не кэшируются"?
|
|||
|---|---|---|---|
|
#18+
DEVcoach chabapok , честно говоря, до конца не уловил вашей мысли в данном посте. Отмечу лишь следущее: 1) "Бесплатными" на x86 являются не чтения, а записи volatile, так как эта архитектура следует TSO, а потому выставлять барьеры при записи не нужно. Единственный барьер, который реально выставляется у volatile на x86, это StoreLoad, то есть чтение-после-записи. Все остальные барьеры на x86 вырождаются в nop. Больше информации здесь: http://g.oswego.edu/dl/jmm/cookbook.html Запись volatile поля на x86 транслируется инструкцию с lock профиксом, а эти инструкции как раз обеспечивают то, что все все процессоры получат именно самое последнее значение, которые было записано, а не то, что может у них быть в храниться в кэше. А как раз чтение volatile поля от простого чтения не отличается вообще. Т.к. чтение будет либо после записи, а т.к. запись это инструкция с префиском lock, то значения всегда будет свежее, либо если записи не было, то будет простая загрузка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2013, 18:09:19 |
|
||
|
Правда ли, что volatile медленные и "не кэшируются"?
|
|||
|---|---|---|---|
|
#18+
schwaЗапись volatile поля на x86 транслируется инструкцию с lock профиксом, а эти инструкции как раз обеспечивают то, что все все процессоры получат именно самое последнее значение, которые было записано, а не то, что может у них быть в храниться в кэше. А как раз чтение volatile поля от простого чтения не отличается вообще. Т.к. чтение будет либо после записи, а т.к. запись это инструкция с префиском lock, то значения всегда будет свежее, либо если записи не было, то будет простая загрузка.Согласен, что-то я наврал про чтения/записи. Тем не менее, с точки зрения голой теории ваши утверждения тоже не являются на 100% верными: 1) StoreLoad барьер может быть выставлен как после чтения, так и до записи, хотя в общем случае более разумной является именно ваша стратегия (барьер после записи): Doug LeeIssue a StoreLoad barrier after each volatile store . Note that you could instead issue one before each volatile load , but this would be slower for typical programs using volatiles in which reads greatly outnumber writes.2) StoreLoad барьер не обязательно сопряжен с lock-инструкцией: Doug LeeAlternatively, if available, you can implement volatile store as an atomic instruction (for example XCHG on x86) and omit the barrier . This may be more efficient if atomic instructions are cheaper than StoreLoad barriers. Ох уж эта теория JMM. В каждом предложении можно засыпать себя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2013, 18:32:22 |
|
||
|
Правда ли, что volatile медленные и "не кэшируются"?
|
|||
|---|---|---|---|
|
#18+
Все "может реализовать как" и прочее есть не более чем советы/пожелания, которые на данный момент нигде не реализованы. Тоже "удаление барьеров" может сейчас присутствовать (а может даже у них таких такого нет) разве что в JVM с ahead-of-time компилятором (самую известную из которых вроде как пилят в Новосибирске, если не ошибаюсь). JVM с JIT-ом об этом можно только мечтать. А относительно других инструкций Intel® 64 and IA-32 Architectures Software Developer’s Manual 8.1.2.2 Software Controlled Bus Locking To explicitly force the LOCK semantics, software can use the LOCK prefix with the following instructions when they are used to modify a memory location. An invalid-opcode exception (#UD) is generated when the LOCK prefix is used with any other instruction or when no write operation is made to memory (that is, when the destination operand is in a register). .... • The LOCK prefix is automatically assumed for XCHG instruction. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2013, 20:00:38 |
|
||
|
Правда ли, что volatile медленные и "не кэшируются"?
|
|||
|---|---|---|---|
|
#18+
DEVcoachКоллега, я не могу понять, что вы от меня хотите. Был задан сугубо теоретический вопрос, с помощью которого я хотел понять, как люди видят volatile. Точка. Нет никаких "условий". Коллега, здесь теории очень мало. Volatile - это не тот термин который обсуждают теоретики. Это практическая вещь. В дополнение к тому что сказал jdroid. Давайте обратимся к документу The Java® Language Specification Java SE 7 Edition Там есть несколько упоминаний сабж. The Java® Language Specification Java SE 7 Edition 8.3.1.4 volatile Fields The Java programming language allows threads to access shared variables (§17.1). As a rule, to ensure that shared variables are consistently and reliably updated, a thread should ensure that it has exclusive use of such variables by obtaining a lock that, conventionally, enforces mutual exclusion for those shared variables. The Java programming language provides a second mechanism, volatile fields, that is more convenient than locking for some purposes. A field may be declared volatile, in which case the Java Memory Model ensures that all threads see a consistent value for the variable (§17.4). It is a compile-time error if a final variable is also declared volatile. Код: java 1. 2. 3. 4. 5. 6. 7. This allows method one and method two to be executed concurrently, but guarantees that accesses to the shared values for i and j occur exactly as many times, and in exactly the same order, as they appear to occur during execution of the program text by each thread. Therefore, the shared value for j is never greater than that for i, because each update to i must be reflected in the shared value for i before the update to j occurs. It is possible, however, that any given invocation of method two might observe a value for j that is much greater than the value observed for i, because method one might be executed many times between the moment when method two fetches the value of i and the moment when method two fetches the value of j. The Java® Language Specification Java SE 7 Edition 17.4 Memory Model ....(много букв аж до раздела 17.5) Ссылка на источник Если у вас есть другой документ или другая версия - то я не возражаю. Тоже обсуждается. Но нам в любом случае нужен первоисточник. Не вики и не статьи на хабре а нечто более первоисходное. Тем более что в авторстве JLS стоит Джеймс Гослинг. Я не супер-силён в английском и поэтому предлагаю изучить и прокомментировать вместе. В спорных моментах - можем прогнать test examples. Ну а если сами не сможет создать свои - то вывод не понимаем зачем это нужно и не знаем где применить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2013, 21:50:56 |
|
||
|
Правда ли, что volatile медленные и "не кэшируются"?
|
|||
|---|---|---|---|
|
#18+
mayton , Мой вопрос остается открытым - о чем мы спорим, и к чему хотим прийти? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2013, 22:24:18 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38386379&tid=2128640]: |
0ms |
get settings: |
13ms |
get forum list: |
22ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
41ms |
get topic data: |
18ms |
get forum data: |
5ms |
get page messages: |
89ms |
get tp. blocked users: |
2ms |
| others: | 287ms |
| total: | 489ms |

| 0 / 0 |
