반응형

DeadLockController

@Slf4j
@RestController
public class DeadLockController {
    @GetMapping("/api/deadlock")
    public String deadlock() {
        final Object resource1 = "resource1";
        final Object resource2 = "resource2";

        new Thread(() -> {
            synchronized (resource1) {
                log.info("Thread 1: locked resource 1");

                sleep(500);

                synchronized (resource2) {
                    log.info("Thread 1: locked resource 2");
                }
            }
        }).start();

        new Thread(() -> {
            synchronized (resource2) {
                log.info("Thread 2: locked resource 2");

                sleep(500);

                synchronized (resource1) {
                    log.info("Thread 2: locked resource 1");
                }
            }
        }).start();

        return "deadlock!!";
    }

    private void sleep(long millis) {
        try {
            Thread.sleep(millis);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

실행

  • 서버에 업로드 후 /api/deadlock에 접속하여 데드락을 유발

Thread Dump

  • 5초정도 간격을 두고 4~5개 정도 덤프 파일 생성
APP_PID=`jps | grep jar | awk '{print $1}'` \
&& jstack $APP_PID > thread-dump-0.txt

분석

  • 위에서 생성한 파일을 압축
  • https://fastthread.io/
  • 위 사이트에 접속해서 압축 파일 업로드 후 분석
  • BLOCKED 상태 스레드 확인

  • 두 스레드가 서로의 lock 해제를 대기하는 것 확인

반응형

'Development > Java' 카테고리의 다른 글

[Java] Simple Machine Learning  (0) 2021.02.27
[Java] Regular Expression  (0) 2020.12.28
[Java] Heap Dump  (0) 2020.12.28
[Java] 명령어  (0) 2020.12.28
[Java] Selenium  (0) 2020.12.28

+ Recent posts