0

다른 스레드에서 ReentrantLock을 사용해야합니다. 가능합니까? 오후 8시 30 분 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

모든 잠금 구조가 다른 스레드에 의해 호출되기 때문에 확실히 가능합니다.

두 번째 스레드에서 오류가 발생합니다. 메서드가 release 전에 lock.lock()을 호출하여 Lock 객체를 잠그지 않았기 때문입니다. 따라서 스레드는 잠금 해제 전에 잠금을 소유하지 않으므로 허용되지 않습니다.

+0

알아요. 그러나 그것을 고치는 방법? –

+0

우리가 어떻게하면 좋을지 알지 못하는데 어떻게 추천 할 수 있겠습니까? –

+0

secondMethod가 호출 될 때까지 firstMethod를 일시 중지합니다. –