반응형
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 |