170 похожих чатов

Когда мы пишем synchronize, мы блокируем участок кода и указываем

переменную из-за которой блокируем. Почему эту переменную не указывают volatile?

18 ответов

6 просмотров

мы указываем не переменную из-за которой блокируем, а всего-лишь даем понять synchronized блоку с монитором какого объекта он должен работать

Elisey-Budnitsky Автор вопроса
Elisey Budnitsky
А почему не нужно указывать volatile?

потому что volatile никакого отношения к блокировке на мониторе не имеет.

Elisey Budnitsky
А почему не нужно указывать volatile?

volatile нужно указывать, если мы хотим запретить процессору кешировать значение переменной, но к монитору и блокировке это не относится

Elisey-Budnitsky Автор вопроса
Oleh Marchenko
volatile нужно указывать, если мы хотим запретить ...

Используя volatile переменная не будет оптимизироваться, потому что может изменяться другим потоком, это же может быть связано с synchronize

Elisey Budnitsky
Используя volatile переменная не будет оптимизиров...

если вы собираетесь использовать эту переменную как разделяемую, то почему ее не нужно указывать как volatile? а вообще, вы же не на Java < 5 пишите, есть атомарные обертки, используйте их и не парьтесь с synchronized и volatile

Oleh Marchenko
если вы собираетесь использовать эту переменную ка...

Если доступ к переменной (чтение и запись) защищены замком, то volatile будет лишним

Потому что обычно поле по которому синхранизируемся должно быть final, чтобы разные потоки синхронизировались по одному объекту, а не по разным. А final volatile это запрещённая комбинация, поэтому volatile не ставят

Elisey-Budnitsky Автор вопроса
Vladimir Sitnikov
Потому что обычно поле по которому синхранизируемс...

Мне кажется я никогда final не писал для объекта синхронизации

Elisey Budnitsky
Мне кажется я никогда final не писал для объекта с...

А зря (если речь про поле, а не по локальную переменную). Разумеется, для самой синхранизации оно ничего не даёт, но оно даёт уверенность, что синхронизироваться будем по одному и тому же.

Elisey Budnitsky
Мне кажется я никогда final не писал для объекта с...

Объект по которому выполняется синхронизация очень рекомендуется делать всегда final. Вне зависимости от того, используется intrinsic lock или объект интерфейса Lock

Elisey Budnitsky
А почему не нужно указывать volatile?

Потому что эта конструкция и так подразумевает synchronizes-with

Oleh Marchenko
А что же, просвети?

Он создаёт отношение synchronizes-with между операциями над тем, модификатором чего он является. Миф про кэш на ядре повторяют только те, кто а) не знают про cache coherency и что процы за редким исключением сами синхронизируют кэши и б) не понимают, что абстрактная спецификация языка не может таргетировать конкретное железо

Etki
Он создаёт отношение synchronizes-with между опера...

Ок, спасибо, но нормальным людям это знать не нужно)

Похожие вопросы

Обсуждают сегодня

@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Заметил в ghci 9.4.8: > :t (<*>) @((->)_) (<*>) @((->)_) :: (w -> (a -> b)) -> (w -> a) -> w -> b Разве не должно (w -> (a -> b)) быть записано как (w -> a -> b)? Это баг, ил...
Михаил
13
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
Any electron dev here?
Sayanth Tezro
12
Подобного рода ;Следующие три строки это директивы ассемблера, ;которые можно не задавать, т.к.работаем в Visual Studio. ;Символ ";" - это начало однострочного комментария ...
Егор Анелькин
3
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
Кто-нибудь знает почему SPM клонирует репо целиком? Некоторые репы просто огромные, как та же swift-syntax которая нужна для использования макросов. Сначала подумал, что это...
iMike
6
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
Привет. Я верно понимаю, что в определении класса Монад m — зафиксирован (к тому же поскольку это моноид в категории эндофункторов). Т.е. используя байнд я не могу перемещать...
Arseny
5
Карта сайта