자바 의 Synchronized 키워드 학습 가이드(전면&상세)

머리말
자바 에서 자주 무시 되 지만 매우 중요 한 키워드 Synchronized 가 있 습 니 다.오늘 은 자바 키워드 Synchronized 의 모든 지식 을 자세히 설명 하 겠 습 니 다.좋아 하 시 길 바 랍 니 다.
목차
示意图
1.정의
자바 의 키워드 1 개
2.역할
동기 화 된 수식 방법/코드 를 같은 시간 에 최대 1 개의 스 레 드 만 실행 하도록 보장 합 니 다.
다른 스 레 드 는 현재 스 레 드 가 이 방법/코드 블록 을 실행 한 후에 야 이 방법/코드 블록 을 실행 할 수 있 습 니 다.
3.응용 장면
스 레 드 안전 을 확보 하고 다 중 스 레 드 중의 동시 다발 문 제 를 해결 합 니 다(차단 형 동시 다발 을 실현 합 니 다).구체 적 인 장면 은 다음 과 같 습 니 다.
인 스 턴 스 방법/코드 블록 을 수식 할 때(동기 화)는 같은 대상 방법의 호출&현재 인 스 턴 스 대상 이 정적 방법/코드 블록 을 수식 할 때(동기 화)는 정적 방법의 호출&class 클래스 대상 을 보호 합 니 다.
4.원리
JVM 에 의존 하여 동기 화 바 텀 을 하나의 모니터 대상(monitor)을 통 해 완성 하고 wait(),notify()등 방법 도 monitor 대상 에 의존 합 니 다.
모니터 잠 금(monitor)의 본질은 바 텀 운영 체제 의 상호 배척 잠 금(Mutex Lock)실현 에 의존한다.
5.구체 적 사용
Synchronized 는 코드 블록,클래스 의 인 스 턴 스 방법&정적 방법 을 수식 하 는 데 사 용 됩 니 다.
5.1 사용 규칙
示意图
5.2 자물쇠 의 유형&등급 은 Synchronized 가 코드 블록,클래스 의 인 스 턴 스 방법&정적 방법 을 수식 하기 때문에 서로 다른 자물쇠 의 유형 으로 나 뉘 는데 구체 적 으로 다음 과 같다.
示意图
사이 의 차이
示意图
5.3 사용 방식

/**
 *    
 */
 public class Test{ 
 //    :  1(   ) 
 public synchronized void Method1(){ 
  System.out.println("          "); 
  try{ 
   Thread.sleep(500); 
  } catch (InterruptedException e){ 
   e.printStackTrace(); 
  } 
 
 } 
 
 //    :  2(     ) 
 public void Method2(){ 
  synchronized (this){ 
   System.out.println("     "); 
   try{ 
    Thread.sleep(500); 
   } catch (InterruptedException e){ 
    e.printStackTrace(); 
   } 
  } 
 
 } 
 }

/**
 *    (        1)
 */
 public synchronized void Method1(){ 
  System.out.println("          "); 
  try{ 
   Thread.sleep(500); 
  } catch (InterruptedException e){ 
   e.printStackTrace(); 
  } 
 
 } 

/**
 *   
 */
public class Test{ 
   //   :  1 :     
 public static synchronized void Method1(){ 
  System.out.println("      "); 
  try{ 
   Thread.sleep(500); 
  } catch (InterruptedException e){ 
   e.printStackTrace(); 
  } 
 
 } 
 
 //   :  2 :      
 public void Method2(){ 
  synchronized (Test.class){ 
   System.out.println("      "); 
   try{ 
    Thread.sleep(500); 
   } catch (InterruptedException e){ 
    e.printStackTrace(); 
   } 
 
  } 
 
 } 
}
5.4 각별히 주의
Synchronized 수식 방법 에 결함 이 있 습 니 다.큰 방법 하 나 를 수식 하면 효율 에 큰 영향 을 줄 수 있 습 니 다.
예시
Synchronized 키 워드 를 사용 하여 스 레 드 류 의 run()을 수식 하면 run()은 스 레 드 의 전체 수명 내 에 계속 실행 되 기 때문에 이러한 종류의 어떠한 Synchronized 방법 에 대한 호출 도 성공 하지 못 할 것 입 니 다.
해결 방안
Synchronized 키워드 성명 코드 블록 사용 하기
이 해결 방안 은 유연성 이 높다.임의의 코드 블록&잠 금 대상 을 임의로 지정 할 수 있다.

    
 synchronized(syncObject) { 
 //                
 //              syncObject(     )  
}
6.특징
示意图
주:원자 성,가시 성,질서 성의 정의
示意图
7.기타 제어 병행/스 레 드 동기 화 방식
7.1 Lock,ReentrantLock 안내
示意图
구별
示意图
7.2 CAS
7.2.1 정의
compare And Swap,즉 비교 및 교환 은 병행 작업 을 해결 하 는 낙관적 인 자물쇠 입 니 다.
synchronized 잠 긴 코드 블록:같은 시간 에 하나의 스 레 드 로 만 접근 할 수 있 으 며 비관 적 인 잠 금 에 속 합 니 다.
7.2.2 원리

// CAS     
    (A)
    (B)
    (C)

//   CAS       :
// 1.     A、B,   ,   A    C、  True;    ,   false;
// 2.      ,                

//      
public boolean compareAndSwap(long memoryA, int oldB, int newC){
 if(memoryA.get() == oldB){
  memoryA.set(newC);
  return true;
 }
 return false;
}


7.2.3 장점
자원 소모 가 적 음:synchronized 에 비해 스 레 드 를 걸 고 스 레 드 를 복원 하 는 비용 을 절약 합 니 다.
그러나 업데이트 가 늦 어 지면 순환 은 CPU 자원 에 도 낭비 된다.
7.2.4 구체 적 인 실현 방식 은 CAS 를 사용 하여'먼저 검사 한 후에 실행'하 는 조작 이 있 는데 이런 조작 은 자바 에서 전형 적 인 안전 하지 않 은 조작 이기 때문에 CAS 는 실제 적 으로 C++에서 CPU 명령 을 호출 하여 실현 하 는 구체 적 인 과정 이다.

// 1. CAS Java     Unsafe 
// 2. Unsafe    C++            
// 3.    CAS C++ Atomic::cmpxchg      
7.2.5 전형 적 인 응용:AtomicInteger
i++와 iC 에 대해 서 는 compare AndSet&하나의 순환 을 통 해 이 루어 집 니 다.
반면compareAndSet함수 내부=jni조작CAS명령 을 통 해.CAS 작업 이 성공 할 때 까지 순환 을 뛰 어 넘 습 니 다.

 private volatile int value; 
 /** 
  * Gets the current value. 
  * 
  * @return the current value 
  */ 
 public final int get() { 
  return value; 
 } 
 /** 
  * Atomically increments by one the current value. 
  * 
  * @return the previous value 
  */ 
 public final int getAndIncrement() { 
  for (;;) { 
   int current = get(); 
   int next = current + 1; 
   if (compareAndSet(current, next)) 
    return current; 
  } 
 } 
 
 /** 
  * Atomically decrements by one the current value. 
  * 
  * @return the previous value 
  */ 
 public final int getAndDecrement() { 
  for (;;) { 
   int current = get(); 
   int next = current - 1; 
   if (compareAndSet(current, next)) 
    return current; 
  } 
 }
8.총화
본 고 는 주로 자바 에서 자주 무시 되 지만 매우 중요 한 키워드 인 Synchronized 에 대해 설명 한다.
자바 의 Synchronized 키워드 학습 안내서 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.자바 의 Synchronized 키워드 에 관 한 더 많은 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기