0

Мне нужно использовать ReentrantLock в разных потоках. Это возможно? P.S. В secondMethod "lock.unlock()" throw IllegalMonitorStateException.Параллелизм (ReentrantLock) в разных потоках

public class SomeClass { 
    private static ConcurrentHashMap<String, String> hashMap = new ConcurrentHashMap<>(); 
    private final Lock lock = new ReentrantLock(); 

    public void firstMethod(Action action) { 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       //SOME CODE BEFORE LOCK 
       lock.lock(); 
       //SOME CODE AFTER UNLOCK 
      } 
     }).start(); 
    } 

    public void secondMethod(Action action) { 
     if (hashMap.get("key").length() == 3) 
      lock.unlock(); 
    } 
} 

Редактировать: Решено с помощью java.util.concurrent.locks.Condition!

ответ

0

Нить, которая блокирует, также должна быть нитью, которая разблокируется. Попытка решить его каким-либо другим способом привела бы к условиям гонки.

0

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

У вас возникла ошибка во вторых потоках, потому что ваш метод не заблокировал объект Lock, вызвав lock.lock() перед выпуском; таким образом, ваш поток не имеет блокировки перед его разблокировкой, что запрещено.

+0

Я знаю. Но как это исправить? –

+0

Не зная, какую логику вы хотите достичь, как мы можем рекомендовать :) –

+0

приостановить выполнение firstMethod до вызова secondMethod –