Комментарии 17
Жду вторую часть! Спасибо!
большое спасибо за статью! очень удобная и понятная агрегация!
Технически любая запись в волатильное поле происходит до каждого последующего чтения этого же поля
Нет, вообще не гарантируется. Гарантируется SeqCst, что позволяет в среднем притвориться, что эффектов кеша для данной переменной не существует. А вот каких либо гарантий на то, через какое время остальные потоки увидят данное изменение — таких гарантий нигде в jvm получить нельзя.
Вы правы, что нельзя гарантировать через какое время поток увидит обновление.
Но JMM гарантирует, что когда он его увидит — оно будет правильным, и все предыдущие эффекты будут видны.
Это и есть happens-before между volatile write - volatile read)
Стоит не забывать ещё такой полезный инструмент как Java Concurrent Animated.
Может быть чрезвычайно полезен при изучении многопоточки.
Спасибо!
Статические методы синхронизируются так же, как и методы экземпляра.
возможно не совсем понял формулировку, но ведь статический метод по Class, а методы экземпляра по this?
Атомарные операции гарантируют, что операция будет выполнена полностью и никакой другой поток не сможет изменить значение переменной до завершения операции. Это обеспечивается блокировкой переменной
Ну ну... Вы бы хоть про CAS (compare and swap) операции для начала что нибудь почитали, прежде чем писать откровенную чушь или исходники глянули. Нет там никаких блокировок. Какие сеньоры сейчас, такие и статьи.
Спасибо!
Я бы рекомендовал построить часть статьи следующим образом: вы сначала рассказываете про Java Memory Model в целом (про кэш ядер, общую память и т.д.) и объясняете проблематику доступа к данным другого потока. А потом из этой проблематики презентуете решения, а именно отношение happens-before и гарантии, который предоставляет виртуальная машина (locks, synchronized, volatile). И дальше более сложные механизмы: от CAS до Phaser.
Тогда, как мне кажется, выйдет гораздо более логично и последовательно.
Не понимаю смысл спрашивать всё это и подобное на собесах - нет же никакого смысла разработчику постоянно держать в голове по сути справочную информацию. То есть фрагменты какие-то все помнят, воспроизвести всё в деталях по памяти и не ошибиться... это же как повезёт, всегда проще при необходимости обратиться к справочнику.

Многопоточность без боли: моя шпаргалка для собесов в Java