자바 스 레 드 잠 금 인 스 턴 스 및 해결 방법
1.자물쇠 의 정의
자물쇠 란 여러 스 레 드 가 경쟁 자원 으로 인 한 교착 상태(서로 기다 리 기)를 말 하 는데 외력 작용 이 없 으 면 이런 과정 은 앞으로 추진 할 수 없다.
2.자물쇠 가 생기 는 필수 조건
상호 배척 조건:스 레 드 는 분 배 된 자원(예 를 들 어 프린터)에 대해 배타 적 인 통 제 를 요구 합 니 다.즉,한 동안 특정한 자원 은 하나의 스 레 드 만 차지 합 니 다.이 때 스 레 드 가 이 자원 을 요청 하면 스 레 드 를 기다 릴 수 밖 에 없습니다.
조건 을 박탈 하지 않 습 니 다:스 레 드 에서 얻 은 자원 은 사용 이 완료 되 지 않 기 전에 다른 스 레 드 경향 에 의 해 빼 앗 길 수 없습니다.즉,이 자원 을 얻 은 스 레 드 만 스스로 방출 할 수 있 습 니 다(주동 적 으로 방출 할 수 있 습 니 다).
요청 과 유지 조건:스 레 드 는 최소한 하나의 자원 을 유지 하고 있 지만 새로운 자원 요청 을 했 습 니 다.이 스 레 드 는 다른 스 레 드 에 의 해 점유 되 었 습 니 다.이 때 요청 프로 세 스 가 막 혔 지만 자신 이 얻 은 자원 을 놓 지 않 습 니 다.
순환 대기 조건:스 레 드 자원 의 순환 대기 체인 이 존재 합 니 다.체인 의 모든 스 레 드 에서 얻 은 자원 은 체인 의 다음 스 레 드 에 의 해 요청 되 었 습 니 다.즉,대기 상태 에 있 는 스 레 드 집합{P1,P2,...,Pn}이 존재 합 니 다.그 중에서 Pi 가 기다 리 는 자원 은 P(i+1)에 의 해 점유 되 었 습 니 다(i=0,1,..,n-1).Pn 이 기다 리 는 자원 은 P0 에 의 해 점유 되 었 습 니 다.다음 그림 입 니 다.
3.자물쇠 가 생기 는 예
/**
*
* DeadLock flag==1 (td1), o1, 500ms
* td1 flag==0 (td2) , o2, 500ms
* td1 o2 , o2 td2 ;
* td2 o1 , o1 td1 ;
* td1、td2 , , 。
*/
public class DeadLock implements Runnable {
public int flag = 1;
//
private static Object o1 = new Object(), o2 = new Object();
@Override
public void run() {
System.out.println("flag="+flag);
if(flag==1){
synchronized (o1){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2){
System.out.println("1");
}
}
}
if(flag==0){
synchronized (o2){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o1){
System.out.println("0");
}
}
}
}
public static void main(String[] args) {
DeadLock td1 = new DeadLock();
DeadLock td2 = new DeadLock();
td1.flag=1;
td2.flag=0;
//td1,td2 , JVM 。
//td2 run() td1 run()
new Thread(td1).start();
new Thread(td2).start();
}
}
4.잠 금 을 피 하 는 방법
어떤 경우 에는 자 물 쇠 를 잠 그 는 것 을 피 할 수 있다.잠 금 을 피 하 는 데 쓰 이 는 두 가지 기술
1)잠 금 추가 순서(스 레 드 는 일정한 순서에 따라 잠 금 추가
2)잠 금 시한(스 레 드 가 잠 금 을 가 져 올 때 일정한 시한 을 추가 하고 기한 을 초과 하면 이 잠 금 에 대한 요청 을 포기 하고 자신 이 차지 하 는 자 물 쇠 를 방출)
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.