일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- 물리 메모리
- apk 빌드 과정
- AsyncListDiffer
- 상태관리
- 리사이클러뷰
- 내부 단편화
- DiffUtil
- Dispatchers
- flutter
- NestedScrollView
- appcompatacitivity
- 절대 주소
- Kotlin
- 플로이드워셜
- http발전과정
- viewModelScope
- 자이고트
- 운영체제
- http 역사
- 뷰홀더
- 데코레이터 패턴
- GetX
- appcompatactivity
- 프로세스
- Android
- 디자인 패턴
- 리사이클러뷰풀
- 안드로이드
- recyclerview
- AAC
- Today
- Total
hong's android
[Java] DeadLock 본문
DeadLock
교착상태에 빠진것을 의미한다. 교착 상태란 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태를 가리킨다.
아래 예시는 두개의 프로세스가 교착상태에 빠졌을때를 보여준다.
교착상태 성립 조건
- 상호배제 : 사용중인 자원을 다른 프로세스가 접근하지 못한다.
- 점유대기 : 자원을 가지고 있는데 다른 프로세스가 가지고 있는 자원을 가지고 있다.
- 비선점 : 자원을 함부로 뺐을 수 없다.
- 순환대기 : 서로가 서로의 자원을 기다리고 있는 상태이다.
자바에서 두 스레드들의 교착상태
public class Main {
public static Object object1 = new Object();
public static Object object2 = new Object();
public static void main(String[] args) {
FirstThread thread1 = new FirstThread();
SecondThread thread2 = new SecondThread();
thread1.start();
thread2.start();
}
private static class FirstThread extends Thread{
@Override
public void run() {
synchronized (object1){
System.out.println("First Thread has object1's lock");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("First Thread want to have object2's lock. so wait");
synchronized (object2){
System.out.println("First Thread has object2's lock too");
}
}
}
}
private static class SecondThread extends Thread{
@Override
public void run() {
synchronized (object2){
System.out.println("Second Thread has object2's lock");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Second Thread want to have object1's lock, so wait");
synchronized (object1){
System.out.println("Second Thread has object1's lock too");
}
}
}
}
}
위 두개의 자바 스레드는 4조건을 모두 만족하기 때문에 교착상태에 빠지게된다.
1. 상호배제 : FirstThread가 object1 자원을 사용할때 SecondThread는 사용하지 못한다.
2. 점유대기 : FirstThread는 자원 object1을 사용하고 있고
3. 비선점: FirstThread가 자원 object1을 사용하고 있고 SecondThread는 뺐고 실행하지못한다.
4. 순환대기 : FirstThread는 자원 object1을 사용하고 있고 SecondThread는 object2의 synchronized를 기다린다. SecondThread는 반대로 object1의 synchronized를 기다린다.
예방
교착상태가 일어나기 위한 조건을 하나라도 제거한다.
위 자바 코드로 예시를 들어보자. 순환대기의 상태를 부정하기 위해선 스레드가 서로의 자원을 기다리면서 사이클이 이루어지는 상황을 제거 해야한다. 그렇기 때문에 점유 요청 순서를 FirstThread와 SecondThread 모두 object1 -> object2 순서대로 점유한다. 하지만 순환대기가 이루어지는것을 알고 해당 부분에 점유 순서를 설정하기 어렵다.
회피
교착상태가 일어날것을 예상하고 회피하기 위한 알고리즘을 적용한다.
1.프로세스에서 하나의 자원을 가지는 경우(자원 할당 그래프 알고리즘)
프로세스 시작 전 자원 할당 그래프에 예약 간선을 추가하여 예약 간선이 사이클을 이루지 않을때에만 자원을 할당 받을 수 있다.
P2를 R2에 할당하면 사이클이 생긴다. 그런 경우 자원을 할당하면 안된다.
2.프로세스에서 여러 자원을 가질 수 있는경우 (은행원 알고리즘)
각 프로세스는 자신에게 필요한 각 자원의 최대치를 선언한다. 프로세스가 자원을 할당해도 안정 상태가 유지되면 자원을 할당 받을수 있다.
무시
Dead lock이 매우 드물게 일어나면 따로 처리를 하지 않는다. 데드락을 처리하는 비용이 많이 들기 때문이다.
출처
https://math-coding.tistory.com/175
[Java] 자바 쓰레드 교착상태(deadlock)
이 글은 "자바 온라인 스터디" 내용을 가지고 공부하여 작성한 글입니다. Thread DeadLock 이란? 멀티 쓰레드 프로그래밍에서 동기화를 통해 락을 획득하여 동일한 자원을 여러 곳에서 함부로 사용하
math-coding.tistory.com
'Develop > Java' 카테고리의 다른 글
[Java] Map 인터페이스 (0) | 2022.12.31 |
---|---|
[Java] 자바와 Jvm에 대해서 (0) | 2022.12.26 |
[Java] java.lang.String 클래스에 대해서 (0) | 2022.12.20 |
[Java] Abstract class VS Interface (0) | 2022.12.20 |
[Java] Arraylist의 길이 확장 방법 (1) | 2022.12.20 |