Статьи о многопоточности в Java — краткий обзор блокировки базы данных + блокировка JUC8

Java
Статьи о многопоточности в Java — краткий обзор блокировки базы данных + блокировка JUC8

предисловие

При изучении базы данных я изучил уровень изоляции транзакций и механизм параллелизма (блокировка строки, блокировка таблицы, оптимистичная и пессимистическая блокировка...), а затем увеличил количество блокировок до 8 (спин, оптимистичная и пессимистическая, ReentantLock, синхронизированная...) при обучении. Java multithreading. ), идея, реализация какое-то время путались. В этой статье не будет глубокого обсуждения того или иного вопроса, а будет лишь краткое изложение, за конкретными подробностями обращайтесь к другим материалам 😑


1. Блокировка базы данных

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


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

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

выполнить

блокировка s (блокировка чтения, общая блокировка)

Когда транзакция A читает данные Y, чтобы предотвратить запись данных Y транзакцией B, что приводит к тому, что транзакция A дважды считывает данные Y, транзакция A добавляет блокировку S.


x lock (блокировка записи, монопольная блокировка)

Когда транзакция A записывает данные Y, чтобы предотвратить чтение данных Y транзакцией B, транзакция B, скорее всего, будет читать временные грязные данные, а транзакция A добавляет X-блокировку.


1.2 Оптимистическая блокировка

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


выполнить

Использование оптимистической блокировки устраняет необходимость полагаться на механизм блокировки базы данных. Типичным методом реализации является технология сравнения и замены (CAS). Когда несколько потоков пытаются использовать CAS для одновременного обновления одной и той же переменной, только один из потоков может обновить значение переменной, в то время как другие потоки терпят неудачу.Неудачный поток не будет приостановлен, но ему будет сообщено об отказе в этом конкурсе и может попробовать еще раз. Недостатком является то, что существует проблема ABA.


1.3 Блокировка намерения

Чтобы разрешить сосуществование блокировок строк и блокировок таблиц и реализовать многогранный механизм блокировки, InnoDB также имеет две внутренние блокировки намерения, обе из которых являются блокировками намерения.блокировка стола.

  • Общая блокировка намерений (IS)

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

  • Эксклюзивная блокировка намерения (IX)

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


1.4 блокировка строки блокировка таблицы блокировка страницы

В соответствии с размером детализации блокировки база данных MySQL может иметь блокировки на уровне таблицы, блокировки на уровне страницы и блокировки на уровне строки в соответствии с различными механизмами хранения.


блокировка стола

Блокировка с наибольшей степенью детализации блокировки в MySQL. Она блокирует всю таблицу, которая в данный момент обрабатывается. Она проста в реализации, потребляет меньше ресурсов, блокируется быстро и не вызывает взаимоблокировок. Его степень детализации блокировки является самой большой, вероятность возникновения конфликтов блокировок выше, а параллелизм является самым низким.Оба механизма MyISAM и InnoDB поддерживают блокировки на уровне таблицы.


блокировка строки

Блокировка с наименьшей детализацией блокировки в Mysql, которая блокирует только строку текущей операции. Блокировки на уровне строк могут значительно уменьшить количество конфликтов в операциях базы данных. Его степень детализации блокировки является наименьшей, а параллелизм высоким, но накладные расходы на блокировку также самые большие, а блокировка выполняется медленно и могут возникать взаимоблокировки. Хотя использование блокировок на уровне строк характеризуется малой детализацией и высоким уровнем параллелизма, в некоторых сценариях также необходимы блокировки на уровне таблиц.

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

блокировка страницы

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


1.5 Алгоритм блокировки

Record Lock

блокировка записи, блокировка записи строки

Gap Lock

Gap lock, блокирует интервал

Next-Key Lock

Блокировка записи + блокировка пробела, блокировка записи строки и интервал



2. Многопоточность Java 8 блокировок


2.1 Честная блокировка/нечестная блокировка

  1. Честная блокировка означает, что несколько потоков, чтобы применить блокировку, чтобы получить блокировку. (в порядке живой очереди, очень честно)
  2. Несправедливая блокировка означает, что порядок, в котором несколько потоков получают блокировки, не соответствует порядку подачи заявок на блокировку.Возможно, что поток, который применяется позже, получит блокировку раньше потока, который применяется первым. Возможно, это вызовет инверсию приоритета или голодание.
Для Java ReentrantLock то, является ли блокировка справедливой блокировкой, указывается в конструкторе, и по умолчанию используется нечестная блокировка. Преимущество нечестных блокировок в том, что пропускная способность выше, чем у честных блокировок.
Для Synchronized это тоже несправедливая блокировка. Поскольку он не реализует планирование потоков через AQS, как ReentrantLock, нет никакого способа сделать его справедливой блокировкой.


2.2 Повторно входящие блокировки

Блокировка с повторным входом, также известная как рекурсивная блокировка, означает, что когда тот же поток получает блокировку во внешнем методе, он автоматически получает блокировку при входе во внутренний метод. Это немного абстрактно, и ниже приведен пример кода.
Для Synchronized это также блокировка с повторным входом. Одним из преимуществ реентерабельных блокировок является то, что в некоторой степени можно избежать взаимоблокировок.

synchronized void setA() throws Exception{

    Thread.sleep(1000);

    setB();

}

synchronized void setB() throws Exception{

    Thread.sleep(1000);

}

// ……………………调用setA()………………………………
// 两个方法都要锁定this对象,如果synchronized不是可重入锁(一个线程可以多次加锁),那么到setB()的时候,就不能对this加锁了,线程卡死在setA()


2.3 Эксклюзивная блокировка/общая блокировка

  1. Эксклюзивная блокировка означает, что блокировка может удерживаться одновременно только одним потоком.
  2. Общая блокировка означает, что блокировка может удерживаться несколькими потоками.

Для Java ReentrantLock это эксклюзивная блокировка. Но для другого класса реализации Lock, ReadWriteLock, его блокировка чтения является общей блокировкой, а его блокировка записи — монопольной блокировкой.
Общая блокировка блокировки чтения может гарантировать, что одновременное чтение будет очень эффективным, а процессы чтения и записи, записи и чтения, записи и записи будут взаимоисключающими.
Эксклюзивные и общие блокировки также реализуются с помощью AQS, а монопольные или общие блокировки могут быть достигнуты путем реализации различных методов.
Для Synchronized, разумеется, это эксклюзивная блокировка.


2.4 Мьютексы/Блокировка чтения-записи

Исключительная блокировка/общая блокировка, упомянутая выше, является широким термином, а блокировка мьютекса/чтения-записи является конкретной реализацией.
Конкретной реализацией мьютекса в Java является ReentrantLock.
Конкретной реализацией блокировки чтения-записи в Java является ReadWriteLock.


2.5 Оптимистическая блокировка/пессимистический замок

Оптимистичные блокировки и пессимистичные блокировки относятся не к конкретным типам блокировок, а к перспективе параллельной синхронизации.
  1. Пессимистические блокировки считают, что параллельные операции с одними и теми же данными должны быть изменены, даже если модификации нет, они будут считаться модифицированными. Поэтому для параллельных операций с одними и теми же данными пессимистическая блокировка принимает форму блокировки. Пессимистично, будут проблемы с одновременными операциями без блокировок.
  2. Оптимистическая блокировка предполагает, что параллельные операции над одними и теми же данными не будут изменены. При обновлении данных данные будут обновляться путем попытки обновления и постоянного обновления данных. С оптимистичной точки зрения, нет ничего плохого в параллельных операциях без блокировок.
Из приведенного выше описания видно, что пессимистичные блокировки подходят для сценариев с большим количеством операций записи, а оптимистичные блокировки подходят для сценариев с большим количеством операций чтения.Отсутствие блокировки приведет к значительному повышению производительности.

выполнить:

  1. Использование пессимистических блокировок в Java заключается в использовании различных блокировок.
  2. Использование оптимистической блокировки в Java — это программирование без блокировок, и часто используется алгоритм CAS Типичным примером является атомарный класс, который реализует обновления атомарных операций через CAS spin.


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

Блокировка сегментации на самом деле представляет собой конструкцию блокировки, а не конкретную блокировку.Для ConcurrentHashMap его реализация параллелизма заключается в достижении эффективных параллельных операций в форме сегментированных блокировок. ConcurrentHashMap использует внутреннюю блокировку сегмента.
Целью разработки блокировки сегмента является уточнение детализации блокировки.Когда операции не требуется обновлять весь массив, операция блокировки выполняется только для одного элемента в массиве.


2.7 Замок смещения/легкий замок/тяжелый замок

Эти три блокировки относятся к состоянию блокировки и предназначены для синхронизации. В Java 5 эффективная синхронизация достигается за счет введения механизма эскалации блокировок. Статус этих трех замков отображается в полях монитора объекта в заголовке объекта.
  1. Смещенная блокировка означает, что поток всегда получает доступ к фрагменту синхронизированного кода, после чего поток автоматически получает блокировку. Снизить стоимость приобретения замков.
  2. Облегченная блокировка означает, что когда блокировка является смещенной блокировкой и к ней обращается другой поток, смещенная блокировка будет обновлена ​​до облегченной блокировки, а другие потоки попытаются получить блокировку, вращаясь без блокировки, что повышает производительность.
  3. Тяжеловесная блокировка означает, что когда блокировка является облегченной блокировкой, несмотря на то, что вращается другой поток, вращение не будет продолжаться вечно. Тяжеловесные блокировки блокируют другие прикладные потоки и снижают производительность.

От предвзятой блокировки -> упрощенная блокировка -> тяжеловесная блокировка — это необратимый процесс обновления блокировки.


2.8 Спин-блокировки

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