lock을 사용하고 있다면 "Thread.sleep(...)"보다 "wait(...)"을 우선해서 사용해야합니다.

 

lock을 점유한 현재 스레드에서 Thread.sleep(...)이 호출될 경우, 성능 문제와 확장성 문제를 야기할 수 있습니다. 심지어 잠금을 유지하는 스레드가 멈춰있기 때문에 데드락 상황을 더욱 악화시킬 수도 있습니다. 일시적으로 잠금을 해제하고 다른 스레드가 실행되도록 하려면, monitor 객체에서 wait(...)를 호출하는 것이 좋습니다.

규칙을 어긴 코드

public void doSomething(){
  synchronized(monitor) {
    while(notReady()){
      Thread.sleep(200); // 규칙을 어긴 코드
    }
    process();
  }
  ...
}

규칙을 준수한 해결책

public void doSomething(){
  synchronized(monitor) {
    while(notReady()){
      monitor.wait(200); // 규칙을 준수한 해결책
    }
    process();
  }
  ...
}

같이보면 좋은 자료


If you like SONARKUBE, don’t forget to give me a star. :star2:

원문으로 바로가기

Star This Project