Добрый вечер ребята~
Галантерея может опоздать, но отсутствовать нельзя! 😄
Эй, эта статья о замках 🔒 ла~
прочитайте вышеConcurrentHashMap
Вы обнаружили, что замков много? Эта статья покажет вам тему~ 😝
Блокировки в Java
Почему в Java это блокировка, потому что есть много типов блокировок, таких как те, которые мы обычно используемMySQL, который также имеет своюблокировка таблицы, блокировка строки, блокировка пробела... ... а такжеРаспределенная блокировка на основе Redis(RedLock - красный замок) Ах,Распределенный замок ZookeeperЖдем всех видов 🔒~
Закопайте дыру 🕳 ~ Я буду писать, когда буду писать темы для баз данных в будущем 😝
4ye подытожила интеллект-карту, друзья могут взглянуть~
оптимистическая блокировка
Сказав это, следует упомянутьJAVA
серединаCAS
Теперь это конкретная реализация такого рода идеи~, я до сих пор помню частое появление вышеупомянутогоUnsafe
класс?ConcurrentHashMap
через это можно назвать этоCAS
( Сравнить и поменять местами / Установить ), перейдите к 😋, чтобы установить значение
концепция:
Чтение не заблокировано и будет заблокировано во время обновления данных (гарантия атомарности)
Детальное объяснение:
При чтении данныхБудет оптимистично, если другие потоки не изменяют данные, поэтому блокировка не произойдет.
При записи данныхБудет принято решение, что текущее значение и ожидаемое значение отличаются. Если они совпадают, они будут изменены. В это время изменение будет заблокировано.
(Здесь также есть несколько очень сложных моментов, связанных с аппаратными блокировками~На основе протокола MESIКонкретные темы будут расширены позже! 😝 )
Метод реализации:
Механизм CAS, механизм номера версии, механизм отметки времени
Почему последних двух механизмов больше?На самом деле это для решения этой проблемыАВА-проблема
АВА-проблема
Моделирование сценария, теперь с тремя потоками
Поток 1 читает переменную a, в это время a=1
Поток 2 считывает переменную a, в это время a=1, и изменяет ее на a=2 после сравнения
Поток 3 считывает переменную a, в это время a=2, и изменяет ее на a=1 после сравнения
В это время поток 1 обнаруживает, что переменная a по-прежнему равна 1, и изменяет ее на другое значение, как и раньше.
Можно обнаружить, что когда поток 1 изменяет значение в этом процессе, потоки 2 и 3 изменили значение переменной a, но не знают об этом~
Итак, чтобы решить эту проблему, мы ввели этоМеханизм номера версии или механизм отметки времени~
По сути, это сравнение еще одного значения, напримерСравнивайте этот номер версии или отметку времени каждый раз, когда меняете его, верно?
Что ж, поскольку мы говорим здесь только о Java, это недалеко~ Хе-хе, но рассуждения все же общие!
Ребята, вы можете обратиться к этомув атомном классе AtomicStampedReference
, это решаетАВА-проблема
пессимистический замок
Это полная противоположность оптимизму. Независимо от операции чтения или записи, все они пессимистично настроены на то, что они будут изменены другими потоками, поэтомуБудь то чтение или запись, он будет заблокирован
концепция:
Пессимистично, чтение и запись должны быть заблокированы, иначе значение будет изменено другими потоками~
Метод реализации:
synchronized,ReentrantLock
честный замок
Достаточно справедливо, обратите внимание на то, что в порядке живой очереди 😄
концепция:
Несколько потоков получают блокировки в том порядке, в котором они применялись для блокировок.
принцип: в основном зависит от поддержания этой блокировкиочередь ожидания, когда очередь пуста, блокировка удерживается напрямую, а если она не пуста, она добавляется вочередь ожиданияв конце, затем следуйтеFIFOпринцип приобрести замок.
Метод реализации:
СоздайтеReentrantLock, отобразить указанныйnew ReentrantLock(true)
Фактически, по этомуAQSДля достижения справедливости и несправедливости здесь тоже есть яма 🕳 Я подробно объясню эту тему позже 😋
несправедливый замок
Я не буду рассказывать вам об этом сначала пришло, а потом пришло 😄
концепция:
Несколько потоков не получают блокировки в порядке очереди, и возможно, что поток, который применяется позже, получит блокировку первым~
принцип: Недобросовестная блокировка попытается получить блокировку, и если это не удастся, она будет добавлена вочередь ожиданияв конце, затем следуйтеFIFOПринцип получения замков становится методом честных замков~
Метод реализации:
СоздайтеReentrantLock
, отобразить указанныйnew ReentrantLock(false)
или используйте метод по умолчанию new ReentrantLock();
а такжеsynchronized
Это ключевое слово также несправедливо
Эксклюзивный замок (эксклюзивный замок)
Владейте блокировкой в одиночку, а не делитесь ею с другими потоками ~ 😄 Синоним мьютекса, эксклюзивной блокировки, пессимистической блокировки
концепция:
Только один поток может удерживать блокировку
Метод реализации:
synchronized
,ReentrantLock
а такжеReentrantReadWriteLock
серединаблокировка записи
общий замок
Блокировку можно использовать совместно с другими потоками~ 😄 Синоним оптимистичной блокировки, блокировки чтения-записи.
концепция:
Блокировки могут удерживаться несколькими потоками
Метод реализации:
ReentrantReadWriteLock
,ReadWriteLock
из двухблокировка чтения
Мьютекс (синхронизированный замок)
Это можно понимать как конкретную реализацию эксклюзивной блокировки~😄
концепция:
Указывает, что ресурс может быть доступен только одному потоку и не может быть доступен другим.
Метод реализации:
synchronized
,ReentrantLock
Блокировка чтения-записи
Как следует из названия ~ есть блокировки чтения и блокировки записи 😄
-
чтение и чтение не исключают друг друга
-
мьютекс чтения-записи
-
мьютекс записи-записи
концепция:
Указывает, что ресурс позволяетНесколько потоков, удерживающих блокировки чтения, могут осуществлять совместный доступ, но только один поток, удерживающий блокировки записи, может быть монопольным.
Метод реализации:
ReentrantReadWriteLock
,ReadWriteLock
Это также включаетзаблокировать понижение версии,а такжевозвращающийсяЖдите интересных моментов~, закапывайте дырку 🕳 Об этом напишу позже 😋
Реентерабельные блокировки (рекурсивные блокировки)
Что такое реентерабельность~ 😄
концепция:
Когда поток удерживает блокировку,Блокировка может быть получена снова без взаимоблокировки или блокировки
Функции:
Приобретите n замков, а также освободите n замков
Метод реализации:
synchronized
,ReentrantLock
блокировка сегмента
Это в основномJdk1.7версияCurrentHashMap
😄
концепция:
Просто помни~
CurrentHashMap
серединаSegment
Массив, который будет вызываться при операции putReentrantLock
метод блокировки, который блокируетSegment
Метод реализации:
synchronized
,ReentrantLock
блокировка спина
Ха-ха, прочитав вышеизложенное, вы думаете, что это тоже очень знакомо~ 😄
Друзья, вы можете видетьCurrentHashMap
Реализация этого блока в исходном коде, напримерput
исходный код
концепция:
Пусть нить непрерывно зацикливается, пытаясь получить замок
Метод реализации:
CAS
Тут на самом деле есть что расширять, помимо своих достоинств и недостатков, естьадаптивный спинэто ивиртуальная машинаСвязанные, закопайте дыру 🕳 😋
тупик
Сценарий
Поток 1 владеет блокировкой ресурса A, а поток 2 владеет блокировкой ресурса B, но поток 1 хочет владеть блокировкой B, удерживая при этом блокировку A. Точно так же поток 2 хочет завладеть блокировкой A, удерживая при этом блокировку B. Двое из них зашли в тупик вот так, ожидая, когда друг друга откроют замок🔒
концепция:
Взаимная блокировка — это явление, при котором два или более процессов блокируются из-за конкуренции за ресурсы или из-за связи друг с другом во время процесса выполнения.Если нет внешней силы, они не смогут продвигаться вперед. В это время говорят, что система находится в состоянии взаимоблокировки или в системе существует взаимоблокировка, и эти процессы, которые всегда ждут друг друга, называются процессами взаимоблокировки.
блокировка обновления
Нет блокировки -> Блокировка смещения -> Легкая блокировка -> Тяжелая блокировка
участие здесьТехнология оптимизации блокировки, сзади иблокировка огрубления,разблокировка замкаи так далее в тему писать ✍
👉 После создания интеллект-карты я обнаружил, что здесь так много тем, которые туманны o((>ω
Просто работай усерднее!
Увидимся в следующий раз все! 😝
Добро пожаловать, чтобы следовать и дружить! ! ( •̀ ω •́ )у
Об авторе :Java4ye4ye, программист, который по будням присылает технические статьи, а в выходные болтает об эмоциях и других нетехнических темах, приятно познакомиться! ! 😝
Обратите внимание на общедоступный номер:Java4yeДобро пожаловать в личный публичный аккаунт блогера~ Здесь мы подготовили для вас ряд обучающих ресурсов, а также различные плагины и программное обеспечение 😋
Давайте начнем эту неожиданную встречу! ~
Добро пожаловать, чтобы оставить сообщение! Спасибо за Вашу поддержку!ヾ(≧▽≦*)о