Модель памяти Java (JMM) — это фундаментальный, но часто неправильно понимаемый аспект параллельного программирования на Java. Представленный в Java 5, JMM определяет, как потоки взаимодействуют с памятью, обеспечивая согласованность и предсказуемость в многопоточных программах. В этой статье мы углубимся в глубины JMM, изучим его ключевые концепции и рассмотрим, как он влияет на параллельную разработку приложений Java.
1. Видимость
Забота о видимости гарантирует, что изменение, внесенное одним потоком, будет видно другим потокам. Без надлежащих механизмов поток может бесконечно скрывать свои изменения от других потоков из-за оптимизации компилятора или процессора.
2. Планирование
Планирование — это порядок выполнения инструкций. JMM допускает определенные переупорядочения по соображениям производительности, но также гарантирует определенные порядки для поддержания семантики программы.
3. Атомность
Атомарность гарантирует, что операция выполняется за один неделимый шаг без возможного вмешательства со стороны других потоков.
1. Случается – до отношений
Это основа JMM. Если действие A происходит «до» действия B, то эффекты A гарантированно будут видны B. Эта связь транзитивна и формирует основу синхронизации в Java.
2. Неустойчивый
Ключевое слово Летучее обеспечивает видимость изменений между потоками. При чтении изменчивой переменной всегда будет видна последняя запись, выполненная в эту переменную.
3. Синхронизировано
синхронизированные блоки и методы устанавливают отношения «прежде чем происходит» между потоками, которые получают и освобождают один и тот же монитор.
4. Финал
Правильно инициализированные финальные поля гарантированно будут видны всем потокам без дополнительной синхронизации.
1. Двойная проверка блокировки
Шаблон блокировки с двойной проверкой был нарушен до версии Java 5 из-за проблем с видимостью. JMM исправил эту проблему, позволив правильно использовать ее с Летучим.
class Singleton { private static volatile Singleton instance; public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }
2. Публикация объектов
Безопасная публикация объектов имеет решающее значение для предотвращения проблем с частичной видимостью. JMM гарантирует, что если объект правильно опубликован (например, через изменчивое поле или потокобезопасный класс), все его поля будут видимы.
3. Реорганизация инструкций
JMM допускает определенные реорганизации, которые могут удивить разработчиков.
Например:
int a, b; a = 1; b = 2;
Можно изменить на:
int a, b; b = 2; a = 1;
Если эти инструкции не окружены соответствующими временными барьерами.
Модель памяти Java — это важнейший аспект параллельного программирования на Java. Несмотря на сложность, понимание этого важно для написания правильного и эффективного параллельного кода. Освоив концепции видимости, планирования и атомарности, а также такие механизмы, как «случается раньше», «изменчивый» и «синхронизированный», разработчики могут создавать надежные и эффективные многопоточные приложения.
Однако важно отметить, что даже при хорошем понимании JMM параллельное программирование остается проблемой. Использование абстракций высокого уровня, подобных тем, которые предоставляются пакетом java.util.concurrent часто может упростить разработку, сохраняя при этом преимущества гарантий JMM.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3