<aside>
😅 백기선님의 10주차 과제를 정리하던 중 기존에 공부했던 내용을 다시 확인했다. 그런데 Deadlock에 관련한 부분은 한문장 정도로 정리되어 있어 따로 빼내어 정리해보려고 한다.
</aside>
<aside> 😅 공부하기 전 필자가 생각하는 Deadlock의 개념은 다음과 같다. 만약 “두개의 Thread가 존재하고 하나의 오브젝트를 사용하려고 할때 이미 점유하고 있는 Thread의 작업이 끝나지 않아 영원히 또 다른 쓰레드가 작업을 시작하지 못하고 멈추는 것” 이라고 생각한다. 과연 맞을까?
</aside>
<aside> 📌 Oracle java Tutorials에는 Deadlock을 이렇게 정의하고 있다.
Deadlock describes a situation where two or more threads are blocked forever, waiting for each other. Here's an example.
요약하자면 ***“둘 이상의 Thread가 영원히 차단되어 서로를 기다리는 상황”***이라고 설명한다. 내가 생각하는 개념적인건 맞다고 생각한다. 하지만 설명을 잘못한 것 같다. 하여튼 예제 상황으로 이를 한번 돌아 보자. 만약 친구 두 명이 있다. 둘은 서로 예의를 잘 지킨다. 하지만 인사를 할 때 엄격한 친구는 또 다른 친구가 인사를 끝내지 않으면 절대 자신이 먼저 인사를 끝내지 않는다. 그러면 어떻게 될까?
</aside>
public class Deadlock {
// 자세한 코드는 오라클 튜토리얼에.. 저작권 때문에
public static void main(String[] args) {
final Friend alphonse =
new Friend("Alphonse");
final Friend gaston =
new Friend("Gaston");
new Thread(new Runnable() {
public void run() { alphonse.bow(gaston); // gaston의 점유 bowBack을 대기하는 상태
new Thread(new Runnable() {
public void run() { gaston.bow(alphonse); // alphonse의 점유 bowBack을 대기하는 상태
}
}
간단하게 어떤 스레드가 bow를 하는 동안 다른 스레드도 같이 bow를 시도한다.
하지만 bow를 끝내려면 bowback을 시도해야하지만 서로가 서로의 bowback을 기다려서 하지못한다.
<aside> 😅 그럼 DeadLock의 조건이 있을까? 다음 조건이 만족하면 DeadLock(교착 상태)에 빠질 수 있다. 반대로 생각해보면 이 조건들을 충족하지 않는다면 DeadLock에서 벗어 날 수 있다.
<aside>
🤔 자 대충 os 관점에서는 상태 전이도를 통해서 Deadlock의 발생 시점을 알 수 있다. asleep일 때 발생하는 것을 알 수 있다. 왜 기아상태와 데드락은 차이가 날까? 기아상태의 경우 우선순위에 의해 결정 난다. 하지만 데드락은 순환에 의하여 발생한다. 그래서 그래프를 통해서 알 수도 있고, 뱅커알고리즘을 통해 safe sequence를 통해서도 알아 낼 수 있다.
</aside>
