0

異なるスレッドでReentrantLockを使用する必要があります。それは可能ですか? P.P. secondMethod "lock.unlock()"では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オブジェクトをロックしなかったため、2番目のスレッドでエラーが発生しました。したがって、あなたのスレッドはロックを解除する前にロックを所有していません。これは許可されていません。

+0

私は知っています。しかし、それを修正する方法は? –

+0

どのようなロジックを達成したいのか分からずに、どうすればよいでしょうか? –

+0

secondMethodが呼び出されるまでfirstMethodの実行を一時停止します –

関連する問題