자바 스 레 드 잠 금 인 스 턴 스 및 해결 방법

이 글 은 주로 자바 스 레 드 잠 금 인 스 턴 스 와 해결 방법 을 소개 하 였 으 며,글 에서 예제 코드 를 통 해 매우 상세 하 게 소개 하 였 으 며,여러분 의 학습 이나 업무 에 대해 어느 정도 참고 학습 가 치 를 가지 고 있 으 며,필요 한 친 구 는 참고 할 수 있 습 니 다.
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)잠 금 시한(스 레 드 가 잠 금 을 가 져 올 때 일정한 시한 을 추가 하고 기한 을 초과 하면 이 잠 금 에 대한 요청 을 포기 하고 자신 이 차지 하 는 자 물 쇠 를 방출)

이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기