Java

Synchronized, проблема с мютексами

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

В предоставленном вами коде оба класса (например, Machine и другой класс) используют один и тот же мьютекс "strings" для синхронизации доступа к общему ресурсу (strings). Синхронизированный блок в Java используется для обеспечения того, чтобы только один поток мог одновременно обращаться к общему ресурсу.

Когда код входит в синхронизированный блок в классе Machine, он получает блокировку мьютекса "strings". Это означает, что другие потоки будут заблокированы до тех пор, пока блокировка не будет снята. Когда код вызывает метод wait(), он снимает блокировку с мьютекса "strings", позволяя другим потокам получить блокировку и войти в синхронизированный блок.

В другом классе, когда код входит в синхронизированный блок, он попытается получить блокировку мьютекса "strings". Поскольку блокировка уже удерживается машинным классом, поток будет заблокирован до тех пор, пока блокировка не будет снята машинным классом. Как только блокировка будет снята, другой класс сможет получить блокировку, войти в синхронизированный блок и выполнить необходимые операции.
Нет
Нет
704
Лучший ответ
Александр Кондрашкин ого, впервые узнал то, что wait снимает блокировку с мьютекса. это то, что я и хотел услышать, спасибо
>Как у нас получается такое, что мы заходим в класс Machine, блокируем мютекс strings и вызываем метод wait, в то время как другой класс должен каким то образом тоже зайти в синхронизированный блок с уже заблокированным мютексом у strings и что-то выполнить.
Не каким-то образом, а вполне конкретным - при помощи своего собственного потока. В раздел с заблокированным мьютексом, второй поток заходить не будет, пока этот мьютекс не освободят.

>Как получается такое, что у нас strings испльзуется сразу в 2х синхронизированных блоках, один и который блокирует его мютекс?
Получается это таким образом, что его объявили в таком месте, где он доступен для обоих потоков и одновременного использования. Если бы strings имелся в двух экземплярах, каждый для своего потока, то смысла изобретать какие-то блокировки и синхронизации бы не было, равно как и межпоточного взаимодействия.