0

我需要在不同的線程中使用ReentrantLock。這有可能嗎? P.S.在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對象;因此您的線程在解鎖之前不擁有該鎖,這是不允許的。

+0

我知道。但如何解決它? –

+0

不知道你想達到什麼邏輯我們如何推薦:) –

+0

暫停執行firstMethod直到secondMethod被調用 –