
Java
Synchronized, проблема с мютексами
Здравствуйте, не могу разобраться с кодом, который увидел в ютюбе. Парень показывает использование wait, notify. Код должен записывать в лист строчку и сразу же удалять её в другом потоке, выводя результат на экран. Все вроде работает, только я одного не пойму: в обоих классах у нас используется блок синхронизации по мютексу "strings". Как у нас получается такое, что мы заходим в класс Machine, блокируем мютекс strings и вызываем метод wait, в то время как другой класс должен каким то образом тоже зайти в синхронизированный блок с уже заблокированным мютексом у strings и что-то выполнить. Как получается такое, что у нас strings испльзуется сразу в 2х синхронизированных блоках, один и который блокирует его мютекс?

Код, на YouTube, использует мьютекс "strings" для синхронизации доступа к общим ресурсам. Методы wait() и notify() используются для управления потоком выполнения между потоками.
В предоставленном вами коде оба класса (например, Machine и другой класс) используют один и тот же мьютекс "strings" для синхронизации доступа к общему ресурсу (strings). Синхронизированный блок в Java используется для обеспечения того, чтобы только один поток мог одновременно обращаться к общему ресурсу.
Когда код входит в синхронизированный блок в классе Machine, он получает блокировку мьютекса "strings". Это означает, что другие потоки будут заблокированы до тех пор, пока блокировка не будет снята. Когда код вызывает метод wait(), он снимает блокировку с мьютекса "strings", позволяя другим потокам получить блокировку и войти в синхронизированный блок.
В другом классе, когда код входит в синхронизированный блок, он попытается получить блокировку мьютекса "strings". Поскольку блокировка уже удерживается машинным классом, поток будет заблокирован до тех пор, пока блокировка не будет снята машинным классом. Как только блокировка будет снята, другой класс сможет получить блокировку, войти в синхронизированный блок и выполнить необходимые операции.
В предоставленном вами коде оба класса (например, Machine и другой класс) используют один и тот же мьютекс "strings" для синхронизации доступа к общему ресурсу (strings). Синхронизированный блок в Java используется для обеспечения того, чтобы только один поток мог одновременно обращаться к общему ресурсу.
Когда код входит в синхронизированный блок в классе Machine, он получает блокировку мьютекса "strings". Это означает, что другие потоки будут заблокированы до тех пор, пока блокировка не будет снята. Когда код вызывает метод wait(), он снимает блокировку с мьютекса "strings", позволяя другим потокам получить блокировку и войти в синхронизированный блок.
В другом классе, когда код входит в синхронизированный блок, он попытается получить блокировку мьютекса "strings". Поскольку блокировка уже удерживается машинным классом, поток будет заблокирован до тех пор, пока блокировка не будет снята машинным классом. Как только блокировка будет снята, другой класс сможет получить блокировку, войти в синхронизированный блок и выполнить необходимые операции.
Александр Кондрашкин
ого, впервые узнал то, что wait снимает блокировку с мьютекса. это то, что я и хотел услышать, спасибо
>Как у нас получается такое, что мы заходим в класс Machine, блокируем мютекс strings и вызываем метод wait, в то время как другой класс должен каким то образом тоже зайти в синхронизированный блок с уже заблокированным мютексом у strings и что-то выполнить.
Не каким-то образом, а вполне конкретным - при помощи своего собственного потока. В раздел с заблокированным мьютексом, второй поток заходить не будет, пока этот мьютекс не освободят.
>Как получается такое, что у нас strings испльзуется сразу в 2х синхронизированных блоках, один и который блокирует его мютекс?
Получается это таким образом, что его объявили в таком месте, где он доступен для обоих потоков и одновременного использования. Если бы strings имелся в двух экземплярах, каждый для своего потока, то смысла изобретать какие-то блокировки и синхронизации бы не было, равно как и межпоточного взаимодействия.
Не каким-то образом, а вполне конкретным - при помощи своего собственного потока. В раздел с заблокированным мьютексом, второй поток заходить не будет, пока этот мьютекс не освободят.
>Как получается такое, что у нас strings испльзуется сразу в 2х синхронизированных блоках, один и который блокирует его мютекс?
Получается это таким образом, что его объявили в таком месте, где он доступен для обоих потоков и одновременного использования. Если бы strings имелся в двух экземплярах, каждый для своего потока, то смысла изобретать какие-то блокировки и синхронизации бы не было, равно как и межпоточного взаимодействия.
Похожие вопросы
- Нас обманывали! Что на самом деле означает synchronized void doSomething()
- Зачем создают отдельный объект монитора для synchronized блока?
- Проблема в коде, цикл пропускает строчку и продолжает свою работу без сбоев в остальном.
- Проблема с изучением языка программирования
- Проблема с ТЛаунчеромм
- Java проблема с рефлексией.
- Девочки проблема выбора. Выбираем расцветку и пишем ПОЧЕМУ???Спасибо.
- Вопросы и проблемы с моими растениями