5000 слов | 24 изображения помогут вам лучше понять 21 тип блокировки в Java

Java
5000 слов | 24 изображения помогут вам лучше понять 21 тип блокировки в Java

Основное содержание этой статьи следующее:

本篇主要内容

Эта статья была включена в мойОнлайн-документация по Java,Github

мойПрактический проект SpringCloudНепрерывное обновление

Чтобы помочь вам резюмировать хороший замок:

серийный номер имя замка применение
1 оптимистическая блокировка CAS
2 пессимистический замок синхронизированный, вектор, хеш-таблица
3 блокировка спина CAS
4 повторная блокировка синхронизированный, повторный вход, блокировка
5 Блокировка чтения-записи ReentrantReadWriteLock, CopyOnWriteArrayList, CopyOnWriteArraySet
6 честный замок Reentrantlock(true)
7 несправедливый замок синхронизированный, reentrantlock(false)
8 общий замок Блокировка чтения в ReentrantReadWriteLock
9 эксклюзивный замок Запись блокировок в синхронизированной, векторной, хеш-таблице, ReentrantReadWriteLock
10 тяжелый замок synchronized
11 Легкий замок Технология оптимизации блокировки
12 Блокировка смещения Технология оптимизации блокировки
13 блокировка сегмента concurrentHashMap
14 Мьютекс synchronized
15 блокировка синхронизации synchronized
16 тупик запрашивать ресурсы друг друга
17 замок огрубление Технология оптимизации блокировки
18 снятие блокировки Технология оптимизации блокировки

1. Оптимистичная блокировка

乐观锁

乐观锁оптимистичная мысль, предполагая, что текущая среда больше читает и меньше пишет, вероятность обнаружения параллельной записи относительно низка, а при чтении данных считается, что другие потоки не будут модифицироваться (поэтому блокировки нет). При записи данных оценивается, совпадает ли текущее значение с ожидаемым, и если оно совпадает, оно обновляется (блокируется во время обновления для обеспечения атомарности).

на Яве乐观锁: CAS, сравнить и заменить, сравнить текущее значение (значение в основной памяти), и ожидаемое значение (значение в текущем потоке, копия значения в основной памяти) совпадает, если оно совпадает, обновить, в противном случае продолжить работу CAS.

Как показано на рисунке выше, операции чтения могут выполняться одновременно, и другие потоки не могут выполнять операции записи во время чтения.

2. Пессимистический замок

悲观锁

悲观锁пессимист, то есть считается, что больше записей и меньше чтений, и вероятность параллельной записи высока.Каждый раз, когда я иду получать данные, я думаю, что другие потоки будут модифицировать его, поэтому каждый раз, когда я читаю и записываю данные, Я думаю, что другие потоки изменят его, поэтому каждый раз, когда я читаю и записываю данные, я думаю, что другие потоки изменят его, и он будет постоянно заблокирован. Когда другие потоки хотят прочитать и записать эти данные, они будут заблокированы этим потоком до тех пор, пока этот поток не освободит блокировку, а затем другие потоки не получат блокировку.

на Яве悲观锁: synchronizedДекорированные методы и блоки методов,ReentrantLock.

Как показано на рисунке выше, только один поток может выполнять операции чтения или записи, а другие потоки не могут выполнять операции чтения и записи.

3. Спин-блокировка

mark

自旋锁это техника:Чтобы заставить поток ждать, нам просто нужно заставить его выполнить цикл занятости (spin).

Большинство персональных компьютеров и серверов сегодня представляют собой многопроцессорные (ядерные) системы. Если физическая машина имеет более одного процессора или ядра процессора, два или более потока могут выполняться параллельно одновременно. Поток, запросивший блокировку, «ждет». немного", но не отказался от времени выполнения процессора, чтобы увидеть, скоро ли освободит блокировку поток, удерживающий блокировку.

自旋锁Преимущества:Избегаются накладные расходы на переключение потоков. Операции приостановки потока и восстановления потока должны быть переведены в режим ядра для завершения, и эти операции сильно повлияли на одновременную производительность виртуальной машины Java.

自旋锁Недостатки:Если процессор занимает много времени, он будет потреблять ресурсы процессора напрасно и не будет выполнять никакой полезной работы, что приведет к потере производительности. Следовательно, время ожидания спина должно иметь определенный предел.Если спин превышает лимитированное количество раз и все равно не может получить блокировку, следует использовать традиционный метод для приостановки потока.

**自旋Значение раз по умолчанию: **10 раз, вы можете использовать параметр -XX:PreBlockSpin, чтобы изменить его самостоятельно.

адаптивный自旋:Адаптивный означает, что время вращения больше не является фиксированным, а определяется предыдущим временем вращения того же замка и состоянием владельца замка. Благодаря адаптивному вращению, увеличению времени выполнения программы и постоянному совершенствованию информации о мониторинге производительности предсказание состояния блокировок программы виртуальной машиной будет становиться все более и более точным.

на Яве自旋锁:Ожидание вращения после неудачной операции сравнения в операции CAS.

4. Реентерабельные блокировки (рекурсивные блокировки)

可重入锁

可重入锁это техника:После приобретения блокировки любой поток может снова получить блокировку, не заблокирован блокировкой.

可重入锁Принцип:Получайте и освобождайте блокировки, комбинируя пользовательские синхронизаторы.

  • Получите блокировку еще раз: определите, является ли поток, который получает блокировку, тем потоком, который в настоящее время занимает блокировку, и если да, снова успешно получите ее. После получения блокировки счетчик автоматически увеличивается.
  • Освобождение блокировки: при снятии блокировки счетчик уменьшается.

на Яве可重入锁:ReentrantLock, синхронизированный модифицированный метод или сегмент кода.

可重入锁Роль:Избегайте взаимоблокировок.

Вопрос интервью 1:Что произойдет, если добавить две повторные блокировки, но снять только одну?

Ответ: Программа зависла, и поток не может выйти, то есть нам нужно снять несколько блокировок после подачи заявки на несколько блокировок.

Вопрос интервью 2:Если добавить только одну блокировку, что произойдет, если ее снять дважды?

Ответ: будет сообщено об ошибке java.lang.IllegalMonitorStateException.

5. Блокировка чтения-записи

读写锁это техника:пройти черезReentrantReadWriteLockкласс для реализации. В целях повышения производительности в Java предусмотрены блокировки чтения-записи, использование блокировки чтения для чтения и блокировки записи для записи, гибкое управление, если нет блокировки записи чтение неблокирующее, что в определенной степени улучшает выполнение программы. эффективность. Блокировки чтения-записи делятся на блокировки чтения и блокировки записи.Множественные блокировки чтения не являются взаимоисключающими.Блокировки чтения и записи являются взаимоисключающими, которые контролируются самой JVM.

Блокировка чтения:Позволяет нескольким потокам получать блокировки чтения при доступе к одному и тому же ресурсу.

读锁

Блокировка записи:Только один поток может получить блокировку записи, и одновременный доступ к одному и тому же ресурсу не разрешен.

写锁

как пользоваться:

/**
* 创建一个读写锁
* 它是一个读写融为一体的锁,在使用的时候,需要转换
*/
private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();

Приобретать и снимать блокировки чтения

// 获取读锁
rwLock.readLock().lock();

// 释放读锁
rwLock.readLock().unlock();

Получение и снятие блокировок записи

// 创建一个写锁
rwLock.writeLock().lock();

// 写锁 释放
rwLock.writeLock().unlock();

Блокировки чтения-записи в Java:ReentrantReadWriteLock

6. Честный замок

公平锁

公平锁это мысль:Несколько потоков получают блокировки в том порядке, в котором они применяются. В параллельной среде каждый поток сначала проверяет очередь ожидания, поддерживаемую этой блокировкой. Если текущая очередь ожидания пуста, она будет удерживать блокировку. Если очередь ожидания не пуста, она будет добавлена ​​в конец очереди ожидания. получить поток, а затем удерживать блокировку.

7. Несправедливая блокировка

非公平锁

非公平锁это мысль:Поток пытается получить блокировку, и если он не может получить блокировку, он применяет метод справедливой блокировки. Порядок, в котором несколько потоков получают блокировки, не является порядком «первым пришел — первым обслужен».

преимущество:Производительность нечестных замков выше, чем у честных замков.

недостаток:Можно вызвать голодание потока (поток не может получить блокировку в течение длительного времени)

**Несправедливые блокировки в Java: **synchronized – это несправедливая блокировка. ReentrantLock указывает, является ли блокировка справедливой или несправедливой, посредством конструктора. По умолчанию используется несправедливая блокировка.

8. Общий замок

共享锁

共享锁это мысль:Несколько потоков могут получить блокировку чтения, удерживая блокировку общим способом. Синоним оптимистической блокировки и блокировки чтения-записи.

Общие блокировки, используемые в Java: ReentrantReadWriteLock.

9. Эксклюзивный замок

独占锁

独占锁это мысль:Только один поток может получить блокировку, удерживая ее исключительно. Синоним пессимистических блокировок и блокировок мьютексов.

Эксклюзивные блокировки, используемые в Java:синхронизированный, ReentrantLock

10. Тяжелый замок

重量级锁

Тяжелый замок - это название: synchronizedчерез внутренний объект, называемый блокировкой монитора (monitor) блокировка монитора зависит от базовой операционной системы.Mutex Lockреализовать. Операционная система должна переключаться из режима пользователя в режим ядра, чтобы реализовать переключение потоков, и стоимость этого очень высока. зависит от операционной системыMutex LockРеализованные блокировки называются тяжеловесными блокировками. Оптимизироватьsynchonized, представил轻量级锁,偏向锁.

Тяжелые блокировки в Java: synchronized

11. Легкий замок

轻量级锁

轻量级锁Это механизм оптимизации блокировки, добавленный в JDK6:Облегченные блокировки используют операции CAS для устранения синхронно используемых мьютексов без конкуренции. Облегченные блокировки относятся к тяжеловесным блокировкам, реализованным с использованием мьютексов операционной системы. Облегченные блокировки снижают потребление производительности по сравнению с традиционными тяжеловесными блокировками, использующими мьютексы операционной системы без многопоточной конкуренции. Если за одну и ту же блокировку борются более двух потоков, облегченная блокировка не будет эффективной и должна быть преобразована в тяжеловесную блокировку.

преимущество:Если конфликта нет, накладные расходы на использование мьютекса успешно устраняются операцией CAS.

недостаток:Если есть конфликт, в дополнение к накладным расходам самого мьютекса, есть также накладные расходы на операции CAS, поэтому в случае конфликта облегченные блокировки работают медленнее, чем традиционные тяжелые блокировки.

12. Блокировка смещения

偏向锁

偏向锁Это механизм оптимизации блокировки, добавленный в JDK6:При отсутствии конкуренции вся синхронизация исключается, и даже операция CAS не выполняется. Смещение относится к эксцентриситету, что означает, что блокировка будет смещена в сторону первого потока, который ее получит.Если блокировка не была получена другими потоками в последующем процессе выполнения, поток, удерживающий смещенную блокировку, всегда будет обязательный. Каждый раз, когда поток, удерживающий смещенную блокировку, входит в блок синхронизации, связанный с блокировкой, виртуальная машина больше не может выполнять какие-либо операции синхронизации (такие как блокировка, разблокировка, обновление слова пометки и т. д.).

преимущество:Уберите всю синхронизацию и даже не делайте CAS-операций, что лучше облегченных блокировок.

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

13. Блокировка сегмента

分段锁

分段锁представляет собой механизм:Лучшим примером блокировки сегментов является ConcurrentHashMap.

** Принцип ConcurrentHashMap: ** Внутренне он подразделяет несколько небольших HashMap, называемых сегментами. По умолчанию ConcurrentHashMap дополнительно подразделяется на 16 сегментов, что является параллелизмом блокировок. Если вам нужно добавить ключ-значение в ConcurrentHashMap, вместо блокировки всего HashMap вы сначала получаете сегмент, в котором должно храниться значение ключа по хэш-коду, затем блокируете сегмент и завершаете операцию put. В многопоточной среде, если несколько потоков выполняют операции размещения одновременно, если добавленный ключ-значение не хранится в одном и том же сегменте, может быть достигнут настоящий параллелизм между потоками.

**Безопасность потоков: **ConcurrentHashMap — это массив сегментов, а сегменты заблокированы путем наследования ReentrantLock, поэтому каждая операция, которую необходимо заблокировать, блокирует сегмент, так как каждый сегмент гарантированно является потокобезопасным, т.е. , Реализована глобальная безопасность потоков

14. Мьютекс

互斥锁

Блокировки взаимного исключения являются синонимами пессимистических блокировок и монопольных блокировок, что означает, что доступ к ресурсу может получить только один поток и не может получить доступ к другим потокам.

  • мьютекс чтения-чтения
  • мьютекс чтения-записи
  • мьютекс записи-чтения
  • мьютекс записи-записи

Блокировки синхронизации в Java: synchronized

15. Блокировка синхронизации

同步锁

Блокировка синхронизации является синонимом мьютекса, что означает, что несколько одновременно выполняемых потоков позволяют только одному потоку одновременно обращаться к общим данным.

Блокировки синхронизации в Java: synchronized

16. Тупик

死锁

** Взаимная блокировка — это феномен: ** Если поток A удерживает ресурс x, поток B удерживает ресурс y, поток A ожидает, пока поток B освободит ресурс y, поток B ждет, пока поток A освободит ресурс x, и ни один из потоков не освобождает ресурсы. ресурсы, удерживаемые сами по себе, два потока не могут получить ресурсы другого, что приведет к тупиковой ситуации.

Взаимоблокировки в Java не могут быть сняты сами по себе, поэтому после взаимоблокировки потока поток не может ответить. Поэтому мы должны обращать внимание на параллельные сценарии программы, чтобы избежать взаимоблокировок.

17. Блокировка огрубления

锁粗化

锁粗化это метод оптимизации:Если серия непрерывных операций многократно блокирует и разблокирует один и тот же объект, даже если операция блокировки происходит в теле цикла, даже если действительно нет конкуренции потоков, частые операции взаимного исключения синхронизации приведут к ненужным. Поэтому принимается решение: расширение (огрубление) диапазона блокировки за пределы всей последовательности операций, так что частота блокировки и разблокировки будет значительно снижена, тем самым уменьшая потери производительности.

18. Снятие замка

锁消除

锁消除это метод оптимизации:Просто снимите замок. Когда среда выполнения виртуальной машины Java обнаруживает, что некоторые общие данные не будут оспариваться потоками, может быть выполнено устранение блокировки.

Как судить, что разделяемые данные не будут конкурировать между потоками?

использовать逃逸分析技术: Анализ области действия объекта. Если объект определен в методе A и передается в качестве параметра методу B, он называется побегом метода, если к нему обращаются другие потоки, он называется побегом потока.

Определенные данные в куче не будут ускользать и не будут доступны другим потокам, поэтому их можно рассматривать как данные в стеке, и они считаются частными для потока, и блокировка синхронизации не требуется.

19. синхронизированный

synchronized

synchronizedЭто ключевое слово в Java: используется для изменения методов и экземпляров объектов. Он относится к эксклюзивным блокировкам, пессимистическим блокировкам, реентерабельным блокировкам и нечестным блокировкам.

  • 1. При воздействии на метод экземпляра экземпляр объекта блокируется (этот);

  • 2. При использовании статических методов класс Class блокируется, что эквивалентно глобальной блокировке класса. Все потоки, вызывающие этот метод, будут заблокированы;

  • 3. Когда синхронизация действует на экземпляр объекта, отличный от NULL, она блокирует все блоки кода, которые используют объект в качестве блокировки. Он имеет несколько очередей, и когда несколько потоков одновременно обращаются к объектному монитору, объектный монитор будет хранить эти потоки в разных контейнерах.

Каждый объект имеет объект-монитор. Блокировка заключается в борьбе за объект-монитор. Блокировка блока кода реализуется путем добавления инструкций monitorenter и monitorexit до и после блока кода. Блокировка метода оценивается битом флага.

20. Разница между блокировкой и синхронизацией

自动挡和手动挡的区别

Lock:Это интерфейс на Java, реентерабельные блокировки, пессимистические блокировки, эксклюзивные блокировки, блокировки мьютекса и блокировки синхронизации.

  • 1. Lock должен получить блокировку и снять блокировку вручную. Это как разница между АКПП и МКПП
  • 2.Lock — это интерфейс, а synchronized — это ключевое слово в Java, а synchronized — это встроенная языковая реализация.
  • 3.synchronized автоматически освобождает блокировку, занятую потоком, при возникновении исключения, поэтому это не вызовет феномен взаимоблокировки; и когда в блокировке возникает исключение, если блокировка активно не снимается через unLock(), скорее всего, вызвать явление взаимоблокировки, поэтому при использовании блокировки вам необходимо снять блокировку в блоке finally.
  • 4.Lock может заставить поток, ожидающий блокировки, реагировать на прерывание, а синхронизированный - нет.При использовании синхронизированного ожидающий поток будет ждать вечно и не может реагировать на прерывание.
  • 5. С помощью блокировки вы можете узнать, успешно ли получена блокировка, но не синхронизирована.
  • 6.Lock может повысить эффективность операций чтения несколькими потоками за счет реализации блокировок чтения-записи.

Преимущества синхронного:

  • Это ясно и достаточно просто, чтобы использовать синхронизированный, когда нужны только основные функции синхронизации.
  • Блокировка должна обеспечивать снятие блокировки в блоке finally. Если используется синхронизация, JVM гарантирует, что блокировки автоматически снимаются даже в случае исключения.
  • При использовании блокировки виртуальной машине Java трудно узнать, какие объекты блокировки удерживаются конкретной блокировкой потока.

21. Разница между ReentrantLock и синхронизированным

Lock、ReentrantLock、shnchronzied

ReentrantLockэто класс в Java:Унаследовал класс Lock, реентерабельные блокировки, пессимистические блокировки, эксклюзивные блокировки, блокировки мьютекса и блокировки синхронизации.

划重点

Тот же пункт:

  • 1. В основном решить проблему безопасного доступа к общим переменным
  • 2. Все блокировки являются реентерабельными, также известными как рекурсивные блокировки.Один и тот же поток может получать одну и ту же блокировку несколько раз.
  • 3. Он гарантирует две основные характеристики потокобезопасности: видимость и атомарность.

разница:

  • 1. ReentrantLock похож на ручной автомобиль, ему нужно явно вызывать методы блокировки и разблокировки, синхронизированный неявно получает блокировку освобождения.

  • 2. ReentrantLock может реагировать на прерывание, синхронизированный не может реагировать на прерывание, ReentrantLock обеспечивает более высокую гибкость для обработки недоступности блокировки

  • 3.ReentrantLock уровень API, синхронизированный уровень JVM

  • 4. ReentrantLock может реализовывать справедливые блокировки, несправедливые блокировки, несправедливые блокировки по умолчанию, синхронизированный является несправедливой блокировкой и не может быть изменен.

  • 5. ReentrantLock может связывать несколько условий через Condition

Пасхальные яйца:Разговоры о таком количестве блокировок связаны с блокировкой, ребенок хочет слушать блокировку!

Я Вуконг, кодовый фермер, который стремится стать сильнее! Я собираюсь стать Супер Сайяном!

我的资料

Привет, я悟空哥,7 лет опыта разработки проектов, fullstack-инженер, руководитель группы разработки, очень любит базовые принципы графического программирования. Я пишу два PDF-файла, а именно: 1. Практический проект Spring Cloud (Цзябигуан), 2. Параллелизм Java должен быть известен. я по-прежнему手写了2个小程序, апплет вопроса о кисти Java, апплет вопроса о кисти PMP, нажмите на мое официальное меню учетной записи, чтобы открыть! Кроме того, есть 111 архитектурных материалов и 1000 вопросов для интервью по Java, все они организованы в формате PDF, вы можете обратить внимание на общедоступный аккаунт Wukong Chat Architecture Ответить悟空Получите качественную информацию.

**Вперед -> Просмотр -> Нравится -> Избранное -> Комментарий! ! ! ** моя самая большая поддержка!

Серия "Параллелизм в Java должен знать, должен знать":

1. Встречный интервьюер | 14 схем | Никогда не бойся, что тебя спросят изменчиво!

2. Программист был презираем женой поздно ночью, потому что принцип CAS был слишком простым?

3. Используйте стандартные блоки, чтобы объяснить принцип ABA | Жена снова его понимает!

4. Самый тонкий во всей сети | 21 картинка показывает вам ненадежность коллекции