Параллельное программирование на Java широко используется в практической работе, иногда необходимо сделать какие-то вещи асинхронно за счет многопоточности, а иногда необходимо повысить эффективность выполнения задачи за счет многопоточности. Недавно я делал обзор некоторых основных концепций и принципов программирования на Java и записал их здесь.
ключевые идеи
переключатель контекста
- Концепция: ЦП выделяет время выполнения исполняемым потокам с помощью алгоритма квантования времени. При переключении между различными потоками ему необходимо сохранять состояние текущего потока и отвечать на информацию о состоянии потока, которая должна быть выполнена.Этот процесс представляет собой переключение контекста.
- Как уменьшить или избежать переключения контекста?
- параллельное программирование без блокировок
- CAS-алгоритм
- Используйте наименьшее количество потоков
- сопрограмма
тупик
- Концепция: Два или более потока удерживают блокировки, которые ждут друг друга.
- Как избежать тупика?
- Избегайте одновременного получения потоком нескольких блокировок.
- Избегайте одновременного использования потоком нескольких ресурсов в блокировке и старайтесь обеспечить, чтобы каждая блокировка занимала только один ресурс.
- попробуй использовать временную блокировку
- Для блокировок базы данных блокировка и разблокировка должны выполняться в соединении с базой данных.
Базовый механизм параллелизма в Java
volatile
- Роль: обеспечить общие переменные между несколькими потоками в многопроцессорной разработке.видимость, то есть, когда поток изменяет значение переменной, другие потоки могут сразу увидеть последнее значение переменной.
- Принцип: бытьvolatileКогда измененная переменная записывается, она будет делать следующие две вещи:
- Записать данные текущей строки кэша процессора в системную память;
- Сделать недействительными данные, кэшированные по адресу памяти в других процессорах.
- Использовать баллы:
- Volatile гарантирует только видимость, а не синхронизацию. Например: если измененное значение переменной зависит от последнего измененного значения, использование volatile не может гарантировать безопасность параллелизма.
synchronized
-
Определение: Synchronized — это метод связи между несколькими потоками в Java. Синхронизация имеет три конкретных применения:
- Для обычных синхронизированных методов блокировка является текущим объектом экземпляра.
- Для статических синхронизированных методов блокировкой является объект класса текущего класса.
- Для синхронизированных кодовых блоков замком является объект, настроенный в синхронизированных скобках.
-
Использовать баллы:
- Конструкторы не могут быть изменены с помощью синхронизированных
- Рекомендуется максимально уменьшить степень детализации блокировки, например, использование синхронизированных блоков кода может удовлетворить потребности и нет необходимости использовать синхронизированные методы.
- Если вы можете подтвердить, что все блокировки в вашем приложении в большинстве случаев оспариваются разными потоками, вы можете-XX:+UseBiasedLockingОтключите предвзятую блокировку для повышения производительности.
-
Принцип: введите два понятия: запись монитора (частная структура данных класса Thread) и заголовок объекта Java. Отношения таковы: заголовок объекта Java хранит адрес записи монитора, а запись монитора записывает поток, который его содержит. .
-
монитор: монитор — это не специальный объект, а метод или механизм, Java управляет доступом к объекту через монитор. Каждый объект в Java связан с монитором. В то же время только один поток (Thread) может заблокировать монитор. Когда монитор заблокирован потоком, другие потоки, пытающиеся заблокировать монитор, могут только блокироваться и ждать.
-
Заголовок объекта: синхронизированное состояние блокировки описано в заголовке объекта Java. Заголовки объектов включают слово Mark и слово Klass.
-
В 32-битной виртуальной машине размер всего заголовка объекта составляет 64 бита (т. е. 8 байт), а Mark Word и Klass Word занимают соответственно 4 байта.
Заголовок объекта (32-разрядная виртуальная машина)
-
Состояние блокировки: в Java существует четыре типа блокировок, от низкого до высокого, без блокировки --> предвзятая блокировка --> облегченная блокировка --> тяжеловесная блокировка. Смещенная блокировка опирается на поле в слове маркировки, которое указывает на текущий поток, чтобы определить, является ли держатель блокировки текущим потоком, и если да, то напрямую входит в блок кода синхронизации; предполагая, что смещенная блокировка отключена, облегченная блокировка ссылается до двух Если один поток захватывает блокировку, один получает блокировку, а другой безуспешно получает блокировку, CAS-цикл получает блокировку первым. получение не удалось Поток переходит в состояние блокировки.
-
Процесс эскалации блокировки будет идти только от низкого к высокому, а не от высокого к низкому, что позволяет избежать ненужной траты ресурсов. Например, если состояние блокировки достигло тяжеловесной блокировки, потоки, которые позже конкурируют за блокировку, войдут непосредственно в блок и не будут выполнять циклы CAS. Один из графиков, представленных в Справочнике 7, превосходен, и я поместил его здесь:
java_synchronized.png
-
-
атомарная операция
Атомарные операции на уровне ЦП
Атомарные операции на уровне ЦП должны выполняться инструкциями ЦП, которые обрабатывают данные в памяти через шину, поэтому в ЦП есть два пути:
- Блокировка шины: Используйте команду LOCK, чтобы послать сигнал на шину для реализации
- Кэш блокировки: в определенный момент необходимо гарантировать атомарность только операции определенного адреса памяти;
Атомарные операции в JAVA
Атомарные операции могут быть реализованы в Java через CAS и блокировки.
- Используйте CAS для реализации атомарных операций Начиная с Java 1.5, в пакете java.lang.concurrent предусмотрено множество классов для поддержки атомарных операций, таких какAotmicIntenger,AtomicLong, эти классы могут атомарно увеличивать или уменьшать текущее значение переменной на 1;
- Используйте блокировки для выполнения атомарных операций, а механизм блокировки гарантирует, что только поток, удерживающий блокировку, может работать с указанной переменной;
использованная литература
- Искусство параллельного программирования на Java
- Глубокое понимание серии моделей памяти Java l
- Многопоточное прочесывание знаний (3) — блокировка оптимизации синхронизированной трилогии
- The Java Tutorails
- Параллельное программирование на Java: синхронизированная базовая оптимизация (предвзятая блокировка, облегченная блокировка)
- What's a monitor in Java?
- Официальная документация: потоки и блокировки
- Рекомендуется: Пример заголовка объекта
- Синхронизированный механизм Java
- Документация OpenJDK: Синхронизация