powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Правда ли, что volatile медленные и "не кэшируются"?
25 сообщений из 27, страница 1 из 2
Правда ли, что volatile медленные и "не кэшируются"?
    #38386300
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собственно, сабж. Кто что думает по этому поводу?
...
Рейтинг: 0 / 0
Правда ли, что volatile медленные и "не кэшируются"?
    #38386318
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правда ли что Java тормозит? Что появилось раньше яйцо или курица?
...
Рейтинг: 0 / 0
Правда ли, что volatile медленные и "не кэшируются"?
    #38386363
jdroid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Правда ли, что volatile медленные и "не кэшируются"?
    #38386379
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoachСобственно, сабж. Кто что думает по этому поводу?
Всё очень сильно зависит от
- Реализации JVM
- Платформы
- Количестве записей\чтения volatile поля
и т.п.
...
Рейтинг: 0 / 0
Правда ли, что volatile медленные и "не кэшируются"?
    #38387548
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по сравнению с обычными переменными волатиле медленей, а по сравнению с доступом через synchronized - волатиле быстрей.
...
Рейтинг: 0 / 0
Правда ли, что volatile медленные и "не кэшируются"?
    #38387606
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
chabapokпо сравнению с обычными переменными волатиле медленей, а по сравнению с доступом через synchronized - волатиле быстрей.Достаточно спорное утверждение.
Во-первых, synchronized и volatile решают принципиально разные задачи. synchronized - это и видимость, и критическая секция. volatile - только видимость при условии, что чтение идет после записи.
Во-вторых, частных случаях volatile иожет быть, как таким же по скорости, как и обычная переменная, так и медленнее, чем synchronized.
...
Рейтинг: 0 / 0
Правда ли, что volatile медленные и "не кэшируются"?
    #38387775
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoach,

Если у вас есть свое мнение, с которым вы согласны, то зачем было спрашивать такие вопросы?
не пойму.
...
Рейтинг: 0 / 0
Правда ли, что volatile медленные и "не кэшируются"?
    #38388207
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoachchabapokпо сравнению с обычными переменными волатиле медленей, а по сравнению с доступом через synchronized - волатиле быстрей.Достаточно спорное утверждение.
Во-первых, synchronized и volatile решают принципиально разные задачи. synchronized - это и видимость, и критическая секция. volatile - только видимость при условии, что чтение идет после записи.
Во-вторых, частных случаях volatile иожет быть, как таким же по скорости, как и обычная переменная, так и медленнее, чем synchronized.

ну как бе все равно "синхронизация" в volatile присутствует при записи в нее (и чтении) с разных потоков, хоть и расходы на нее гоооораздо меньшие.
...
Рейтинг: 0 / 0
Правда ли, что volatile медленные и "не кэшируются"?
    #38388318
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрите доклад с JavaOne 2013 от наших соотечественников из Oracle занимающихся бенчмаркингом (Сергей Куксенко & Алексей Шипилев), я к сожалению не помню в каком именно из докладов, но точно есть сравнение обычных и volatile. Если в кратце, то вывод такой - они не медленные.
...
Рейтинг: 0 / 0
Правда ли, что volatile медленные и "не кэшируются"?
    #38388984
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
just_vladimir,

А я писал свой ответ ему как раз по мотивам того видео. Там еще интересно было про атомики и про фелс шаринги.

Но внезапно топикстартер мне завозражал, без приведения каких бы то ни было внятных аргументов. Ну, раз у него за сутки уже сформировалось собственное мнение - не вижу причин оспаривать. У нас ведь демократия: каждый решает сам во что ему верить, а во что нет.
...
Рейтинг: 0 / 0
Правда ли, что volatile медленные и "не кэшируются"?
    #38389058
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
chabapokНо внезапно топикстартер мне завозражал, без приведения каких бы то ни было внятных аргументов. Ну, раз у него за сутки уже сформировалось собственное мнение - не вижу причин оспаривать. У нас ведь демократия: каждый решает сам во что ему верить, а во что нет.Я лишь указал, что ваша позиция неверна в общем случае . Почему?
1) Накладные расходы на synchronized могут быть большими (обычный монитор), маленькими (biased locking), или вовсе нулевыми (он может быть полностью проигнорирован JVM).
2) Накладные расходы на volatille могут быть большими (много пишем), средними (много читаем, редко пишем), или опять таки нулевыми (когда JVM знает, что в нее уже больше никто не будет писать.
...
Рейтинг: 0 / 0
Правда ли, что volatile медленные и "не кэшируются"?
    #38389908
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoach,

1. У вас понятия "большие", "маленькие", "нулевые" не согласованы между пунктами 1 и 2, а работают только внутри пункта.

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

Если мы этого не делаем, то можно вообще сказать, что стандартом это не регламентируется, поэтому можно сделать jvm в которой все наоборот с производительностью.

3. Похоже вы вообще сравниваете непонятно что непонятно с чем. Сравнивать имеет смысл логически идентичные конструкции которые можно реализовать обеими методами.

То есть, если мы захотели пристально смотреть на случай "мало пишем, но много читаем", то давайте смотреть что будет, если мы сделаем это через synchronized. Представьте себе тормоза которые начнутся, если мы каждое чтение волтилей начнем заменять на конструкции внутри synchronized. Даже если там будет biased-locking, без уходов в ядро ос, все равно это взаимоисключающее исполнение, против одновременного при волатилях.

в том видео, что упоминалось, говорили, что на х86 чтение волатилей почти эквивалентно чтению обычной переменной, но на других архитектурах это может быть не так.
...
Рейтинг: 0 / 0
Правда ли, что volatile медленные и "не кэшируются"?
    #38389914
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 из поля зрения в принципе, как сущность, не относящуюся к теме топика.
...
Рейтинг: 0 / 0
Правда ли, что volatile медленные и "не кэшируются"?
    #38389930
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoach, у тебя есть какой-нибудь бенчмарк или юзкейс чтобы мы могли пообсуждать
более предметно? Возможно volatile - это тот самый пингвин которого ты "не умеешь готовить"
или применяешь "не там и не в то время". Это кст. типичная ошибка.
...
Рейтинг: 0 / 0
Правда ли, что volatile медленные и "не кэшируются"?
    #38389935
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton ,
Ну с volatile очень тяжело найти хоть какой-то пример, который что-то продемонстрирует на x86. В этом та и вся проблема, почему его плохо понимают - практически невозможно увидеть глазами результаты от его наличия или отсутствия.
...
Рейтинг: 0 / 0
Правда ли, что volatile медленные и "не кэшируются"?
    #38389947
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoach mayton ,
Ну с volatile очень тяжело найти хоть какой-то пример, который что-то продемонстрирует на x86. В этом та и вся проблема, почему его плохо понимают - практически невозможно увидеть глазами результаты от его наличия или отсутствия.
Тогда извини, я рискну предположить что volatile тебе не нужен. Или у тебя нет задач которые требуют
использования volatile.
...
Рейтинг: 0 / 0
Правда ли, что volatile медленные и "не кэшируются"?
    #38389960
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonТогда извини, я рискну предположить что volatile тебе не нужен. Или у тебя нет задач которые требуют
использования volatile.Как вы пришли к такому выводу? Мой вопрос был сугубо теоретический. И то, что эффект от использования volatile на x86 сложно увидеть, вовсе не означает, что их не надо использовать.
...
Рейтинг: 0 / 0
Правда ли, что volatile медленные и "не кэшируются"?
    #38389967
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В теории конечно всё интересно. Но мы будем обмениваться мнениями и цитатами из
документов и спецификаций. В некотором варианте мы здесь должны рисовать графы
со стрелочками и с барьерами и матрицы достижимости. Но я склоняюсь к выводу
что программинг это всё-таки более практическая наука. Тоесть если я создал
какой-то тест-кейс в котором доказал что volatile работает вовсе на так как пишет
теория (в какой-то реализации JVM для какого-то мобильного телефона Samsung SE)
то значит я эту всю теорию разгромил и нам надо вернуться к началу и спросить
а какие собственно будут условия?

Тоесть я возвращаюсь наверх и спрашиваю. DEVcoach. Каковы наши начальные условия?
...
Рейтинг: 0 / 0
Правда ли, что volatile медленные и "не кэшируются"?
    #38389989
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton ,
Коллега, я не могу понять, что вы от меня хотите. Был задан сугубо теоретический вопрос, с помощью которого я хотел понять, как люди видят volatile. Точка. Нет никаких "условий".
...
Рейтинг: 0 / 0
Правда ли, что volatile медленные и "не кэшируются"?
    #38390057
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoach chabapok , честно говоря, до конца не уловил вашей мысли в данном посте. Отмечу лишь следущее:
1) "Бесплатными" на x86 являются не чтения, а записи volatile, так как эта архитектура следует TSO, а потому выставлять барьеры при записи не нужно. Единственный барьер, который реально выставляется у volatile на x86, это StoreLoad, то есть чтение-после-записи. Все остальные барьеры на x86 вырождаются в nop. Больше информации здесь: http://g.oswego.edu/dl/jmm/cookbook.html

Запись volatile поля на x86 транслируется инструкцию с lock профиксом, а эти инструкции как раз обеспечивают то, что все все процессоры получат именно самое последнее значение, которые было записано, а не то, что может у них быть в храниться в кэше.
А как раз чтение volatile поля от простого чтения не отличается вообще. Т.к. чтение будет либо после записи, а т.к. запись это инструкция с префиском lock, то значения всегда будет свежее, либо если записи не было, то будет простая загрузка.
...
Рейтинг: 0 / 0
Правда ли, что volatile медленные и "не кэшируются"?
    #38390066
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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. В каждом предложении можно засыпать себя.
...
Рейтинг: 0 / 0
Правда ли, что volatile медленные и "не кэшируются"?
    #38390091
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все "может реализовать как" и прочее есть не более чем советы/пожелания, которые на данный момент нигде не реализованы.
Тоже "удаление барьеров" может сейчас присутствовать (а может даже у них таких такого нет) разве что в 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.
...
Рейтинг: 0 / 0
Правда ли, что volatile медленные и "не кэшируются"?
    #38390137
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
class Test {
static volatile int i = 0, j = 0;
static void one() { i++; j++; }
static void two() {
System.out.println("i=" + i + " j=" + j);
}
}


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.

Ну а если сами не сможет создать свои - то вывод не понимаем зачем это нужно
и не знаем где применить.
...
Рейтинг: 0 / 0
Правда ли, что volatile медленные и "не кэшируются"?
    #38390149
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton ,
Мой вопрос остается открытым - о чем мы спорим, и к чему хотим прийти?
...
Рейтинг: 0 / 0
Правда ли, что volatile медленные и "не кэшируются"?
    #38390164
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoach,

svenom, зайди под своим нормальным ником.
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Правда ли, что volatile медленные и "не кэшируются"?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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