JAVA Synchronized 키 워드 를 깊이 분석

병발 일치 성 개념?
자물쇠 의 메커니즘 을 이용 하여 동기 화 를 실현 하 는 것 이다.자물쇠 메커니즘 은 다음 과 같은 두 가지 특성 이 있다.
상호 배척 성:즉,같은 시간 에 하나의 스 레 드 만 특정한 대상 자 물 쇠 를 가 질 수 있 도록 합 니 다.이러한 특성 을 통 해 다 중 스 레 드 중의 조율 체 제 를 실현 합 니 다.그러면 같은 시간 에 하나의 스 레 드 만 동기 화 할 코드 블록(복합 작업)에 접근 할 수 있 습 니 다.상호 배척 성 은 우리 도 흔히 조작 의 원자 성 이 라 고 부른다.
가시 성:자물쇠 가 풀 리 기 전에 공유 변수 에 대한 수정 을 확보 해 야 합 니 다.나중에 이 자 물 쇠 를 얻 은 다른 스 레 드 에 대해 서 는 볼 수 있 습 니 다(즉,자 물 쇠 를 얻 을 때 최신 공유 변수의 값 을 받 아야 합 니 다).그렇지 않 으 면 다른 스 레 드 는 로 컬 캐 시 의 한 복사 본 에서 계속 작 동 하여 일치 하지 않 을 수 있 습 니 다.
Synchronized 의 용법 은?
1.동기 화 방법
동기 화 비정 상 방법

/**
 * Synchronized      
 * @author Administrator
 *
 */
public class SynchronizeDemo01 {

  /**
   *        
   * @Description: TODO
   * @returnType: void
   */
  public synchronized void accessResources1(){
    try {
      TimeUnit.SECONDS.sleep(2);
      System.out.println(Thread.currentThread().getName()+" is running!");
    } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }

  public static void main(String[] args) {

    //        
    SynchronizeDemo01 demo01 = new SynchronizeDemo01();
    for (int i = 0; i < 5; i++) {
      new Thread(demo01::accessResources1).start();
    }

  }

}
 동기 정적 방법

/**
 * Synchronized      
 * @author Administrator
 *
 */
public class SynchronizeDemo01 {
  /**
   *       
   * @Description: TODO
   * @returnType: void
   */
  public synchronized static void accessResources0(){
    try {
      TimeUnit.SECONDS.sleep(2);
      System.out.println(Thread.currentThread().getName()+" is running!");
    } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }

  public static void main(String[] args) {
    //       
    for(int i=0;i<5;i++){
      new Thread(SynchronizeDemo01::accessResources0).start();
    }

  }

}
2.동기 코드 블록
코드 블록 대상,대상 자 물 쇠 를 가 져 옵 니 다.자바 에 서 는 대상 마다 Monitor 대상 이 있 습 니 다.이 대상 은 자바 대상 의 자물쇠 입 니 다.보통'내장 자물쇠'나'대상 자물쇠'라 고 부 릅 니 다.클래스 의 대상 은 여러 개가 있 을 수 있 기 때문에 모든 대상 은 독립 된 대상 자물쇠 가 있 고 서로 간섭 하지 않 는 다.

/**
 * Synchronized      
 * @author Administrator
 *
 */
public class SynchronizeDemo01 {

  /**
   * synchronized   (  ),this       
   * @Description: TODO
   * @returnType: void
   */
  public void accessResources2(){
    synchronized(this){
      try {
        TimeUnit.SECONDS.sleep(2);
        System.out.println(Thread.currentThread().getName()+" is running!");
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
  }


  public static void main(String[] args) {
    //        
    SynchronizeDemo01 demo01 = new SynchronizeDemo01();
    for (int i = 0; i < 5; i++) {
      new Thread(demo01::accessResources2).start();
    }

  }

}
코드 블록(클래스.class)은 클래스 자 물 쇠 를 가 져 옵 니 다.자바 에 서 는 각 클래스 에 대해 하나의 자물쇠 가 있 습 니 다.'클래스 자물쇠'라 고 할 수 있 습 니 다.클래스 자 물 쇠 는 실제 적 으로 대상 자 물 쇠 를 통 해 이 루어 집 니 다.즉,클래스 의 Class 대상 자물쇠 입 니 다.클래스 마다 하나의 Class 대상 만 있 기 때문에 클래스 마다 하나의 자물쇠 만 있 습 니 다.

/**
 * Synchronized      
 * @author Administrator
 *
 */
public class SynchronizeDemo01 {

  /**
   * synchronized   ( .class)
   * @Description: TODO
   * @returnType: void
   */
  public void accessResources3(){
    synchronized(SynchronizeDemo01.class){
      // Class                 
      try {
        TimeUnit.SECONDS.sleep(2);
        System.out.println(Thread.currentThread().getName()+" is running!");
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
  }
  public static void main(String[] args) {
    //        
    SynchronizeDemo01 demo01 = new SynchronizeDemo01();
    for (int i = 0; i < 5; i++) {
      new Thread(demo01::accessResources3).start();
    }

  }

}
자바 대상 의 monitor 대상 의 역할 은?
1.특정한 스 레 드 가 이 대상 을 차지 하려 고 할 때 Monitor 의 카운터 가 0 인지 아 닌 지 를 먼저 판단 합 니 다.0 이 라면 스 레 드 가 차지 하지 않 았 음 을 표시 합 니 다.이때 스 레 드 는 이 대상 을 차지 하고 이 대상 에 대한 Monitor+1 을 차지 할 수 있 습 니 다.0 이 아니라면 이 스 레 드 가 다른 스 레 드 에 의 해 점유 되 었 음 을 표시 합 니 다.이 스 레 드 는 기 다 려 야 합 니 다.스 레 드 가 점유 권 을 방출 할 때 Monitor-1.
2.같은 스 레 드 는 같은 대상 에 게 여러 번 자 물 쇠 를 채 울 수 있 습 니 다.+1,+1,재 입 성.
Synchronized 코드 블록 의 잠 금 장치?
1.코드 블록 에 자 물 쇠 를 추가 하고 역 컴 파일 파일 파일 을 통 해 Monitorenter 와 Monitorexit 사이 에 자 물 쇠 를 추가 하 는 부분 을 발견 합 니 다.

2.방법 에 대한 잠 금 을 추가 하고 역 컴 파일 파일 파일 을 통 해 ACC 가 표 시 된 것 을 발견 합 니 다.SYNCHRONIZED 표 지 는 잠 금 방법 입 니 다.

 자바 가상 컴퓨터 의 몇 가지 자물쇠 비교?

상태 잠 금 없 음:잠 금 없 음
편향 잠 금:대상 이 처음으로 특정한 스 레 드 에 점유 되 었 을 때'편향 잠 금 여부'필드 를 1 로 설정 하고'잠 금 표지 위치'를 01 로 기록 하 며 스 레 드 번 호 를 기록 합 니 다.다른 스 레 드 가 방문 할 때 경쟁 이 발생 하고 경쟁 이 실패 하면 경량급 잠 금 으로 업 그 레이 드 됩 니 다.편향 잠 금 은 첫 번 째 방문 스 레 드 로 자 물 쇠 를 가 져 오 는 데 성공 하 였 습 니 다.
     경량급 잠 금:스 레 드 가 교체 되 어 적용 되 고 상호 배척 성 이 강하 지 않 습 니 다.편향 잠 금 이 CAS 알고리즘 을 통 해 잠 금 을 얻 는 데 실 패 했 을 때 잠 금 표지 의 위 치 를 00 으로 합 니 다.
헤비급 자물쇠:강 한 상호 배척,자물쇠 표지 위 치 는 10 이 고 대기 시간 이 길다.
이상 은 JAVA Synchronized 키워드 의 상세 한 내용 을 깊이 분석 하 는 것 입 니 다.JAVA Synchronized 키워드 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 해 주 십시오!

좋은 웹페이지 즐겨찾기