자바 의 synchronized 키워드:동기 화 메커니즘 요약

19795 단어 자바자바 기술

자바 의 synchronized 키워드:동기 화 메커니즘 요약
JAVA 에서 synchronized 키 워드 는 함수 의 수정자 로 도 사용 할 수 있 고 함수 내의 구문 으로 도 사용 할 수 있 습 니 다.즉,평소에 말 하 는 동기 화 방법 과 동기 화 구문 블록 입 니 다.synchronized 가 잠 긴 대상 이 무엇 인지 알 아내 면 더 안전 한 다 중 스 레 드 프로그램 을 설계 하 는 데 도움 을 줄 수 있 습 니 다.
AD: 51CTO 클 라 우 드 컴 퓨 팅 구조 사 정상 회의 티켓 팅 진행 중!
 
얼마 전에 동기 화 를 사 용 했 는데 지금 은 고 개 를 돌려 JAVA 의 동기 화 에 대해 정 리 를 하여 얼마 전의 업무 총화 와 자기 기술 에 대한 조리 있 는 말 을 한다.JAVA 의 synchronized 키 워드 는 함수 의 수정자 로 도 사용 할 수 있 고 함수 내의 구문 으로 도 사용 할 수 있 습 니 다.즉,평소에 말 하 는 동기 화 방법 과 동기 화 구문 블록 입 니 다.만약 에 더 자세 한 분 류 를 한다 면 synchronized 는 instance 변수,object reference(대상 참조),static 함수 와 class literals(클래스 이름 글자 상수)에 작용 할 수 있 습 니 다.  진일보 한 논술 을 하기 전에 우 리 는 몇 가 지 를 명확 하 게 해 야 한다.  A.synchronized 키 워드 를 방법 에 추가 하 든 대상 에 추가 하 든 그 가 얻 은 자 물 쇠 는 모두 대상 이지 코드 나 함 수 를 자물쇠 로 하 는 것 이 아니 라 동기 화 방법 은 다른 스 레 드 의 대상 에 게 접근 할 수 있 습 니 다.  B.대상 마다 하나의 자물쇠(lock)만 연결 되 어 있 습 니 다.  C.동기 화 를 실현 하 는 데 는 많은 시스템 비용 을 대가 로 하고 심지어 잠 금 을 초래 할 수 있 기 때문에 불필요 한 동기 화 통 제 를 최대한 피해 야 한다.  이어서 synchronized 가 코드 에 미 치 는 영향 에 대해 토론 합 니 다.
P1,P2 가 같은 유형의 서로 다른 대상 이 라 고 가정 하면 이 유형 에서 다음 과 같은 몇 가지 상황 의 동기 화 블록 이나 동기 화 방법 을 정의 하면 P1,P2 는 모두 그들 을 호출 할 수 있다.
자바 의 synchronized 사용 방법 요약
1.  synchronized 를 함수 수정자 로 사용 할 때 예제 코드 는 다음 과 같 습 니 다.
     
     
     
     
  1. Public synchronized void method(){   
  2. //….   
  3. }  

이것 이 바로 동기 화 방법 입 니 다.이때 synchronized 가 잠 긴 대상 은 무엇 입 니까?그 가 잠 근 것 은 이 동기 화 방법의 대상 을 호출 하 는 것 이다.즉,대상 P1 이 서로 다른 스 레 드 에서 이 동기 화 방법 을 실행 할 때 그들 은 서로 배척 하고 동기 화 효 과 를 거 둘 수 있다 는 것 이다.그러나 이 대상 이 속 한 클 라 스 가 만 든 다른 대상 P2 는 synchronized 키 워드 를 추가 한 방법 을 임의로 호출 할 수 있 습 니 다.  위의 예제 코드 는 다음 과 같은 코드 와 같 습 니 다.
     
     
     
     
  1. public void method()   
  2. {   
  3. synchronized (this)      //  (1)   
  4. {   
  5.        //…..   
  6. }   
  7. }   

(1)처 의 this 가 가리 키 는 것 은 무엇 입 니까?그 가 가리 키 는 것 은 바로 이 방법 을 호출 하 는 대상 이다.예 를 들 어 P1.이 를 통 해 알 수 있 듯 이 동기 화 방법 은 실질 적 으로 synchronized 를 object reference 에 작용 하 는 것 이다.그것 은 P1 대상 의 자 물 쇠 를 가 져 와 야 P1 의 동기 화 방법 을 호출 할 수 있 고 P2 에 있어 P1 이라는 자 물 쇠 는 그 와 무관 하 며 프로그램 도 이런 상황 에서 동기 화 체제 의 통 제 를 벗 어 나 데이터 혼란 을 초래 할 수 있다.
2.동기 블록,예제 코드 는 다음 과 같다.
     
     
     
     
  1. public void method(SomeObject so) {   
  2. synchronized(so)   
  3. {   
  4.        //…..   
  5. }   
  6. }   

이때 자 물 쇠 는 바로 so 라 는 대상 이다.이 자 물 쇠 를 가 진 사람 이 그 가 제어 하 는 코드 를 실행 할 수 있다.명확 한 대상 이 잠 겨 있 을 때 이렇게 프로그램 을 쓸 수 있 습 니 다.그러나 명확 한 대상 이 잠 겨 있 지 않 고 코드 를 동기 화하 고 싶 을 때 특별한 intance 변 수 를 만 들 수 있 습 니 다.
     
     
     
     
  1. class Foo implements Runnable   
  2. {   
  3.        private byte[] lock = new byte[0];  //  instance    
  4.     Public void method()   
  5. {   
  6.        synchronized(lock) { //… }   
  7. }   
  8. //…..   
  9. }   

주:0 길이 의 byte 배열 대상 을 만 들 면 그 어떠한 대상 보다 경제적 입 니 다.컴 파일 된 바이트 코드 를 봅 니 다.0 길이 의 byte[]대상 을 만 들 려 면 3 개의 조작 코드 만 필요 하고 Object lock=new Object()는 7 줄 의 조작 코드 가 필요 합 니 다.
3.synchronized 를 static 함수 에 사용 합 니 다.예제 코드 는 다음 과 같 습 니 다.
     
     
     
     
  1.       Class Foo   
  2. {   
  3. public synchronized static void method1()   //  static     
  4. {   
  5. //….   
  6. }   
  7. public void method2()   
  8. {   
  9.        synchronized(Foo.class)   //  class literal( )   
  10. }   
  11.        }   

코드 의 method 2()방법 은 class literal 을 잠 금 으로 하 는 경우 입 니 다.그 는 동기 화 된 static 함수 와 같은 효 과 를 가 집 니 다.잠 금 은 매우 특별 합 니 다.현재 이 방법 을 호출 하 는 대상 이 속 한 클래스(Class,더 이상 이 Class 에서 발생 하 는 구체 적 인 대상 이 아 닙 니 다)입 니 다.  'Effective Java'라 는 책 에서 Foo.class 와 P1.getClass()를 동기 화 자물쇠 로 사용 하 는 것 을 본 적 이 있 습 니 다.P1.getClass()로 이 Class 를 잠 그 는 목적 을 달성 할 수 없습니다.P1 은 Foo 류 에서 발생 하 는 대상 을 말한다.  추정 할 수 있 습 니 다.만약 에 하나의 클래스 에서 synchronized 의 static 함수 A 를 정의 하고 synchronized 의 intance 함수 B 를 정의 한다 면 이 유형의 같은 대상 Obj 는 다 중 스 레 드 에서 각각 A 와 B 두 가지 방법 을 방문 할 때 동기 화 되 지 않 습 니 다.왜냐하면 그들의 자물쇠 가 모두 같 지 않 기 때 문 입 니 다.A 방법의 자 물 쇠 는 Obj 가 속 한 그 Class 이 고 B 의 자 물 쇠 는 Obj 가 속 한 이 대상 이다.
자바 의 synchronized 사용 방법 요약 은 다음 과 같 습 니 다.
synchronized 가 잠 긴 대상 이 무엇 인지 알 아내 면 더 안전 한 다 중 스 레 드 프로그램 을 설계 하 는 데 도움 을 줄 수 있 습 니 다.
공유 자원 에 대한 동기 화 접근 을 더욱 안전하게 할 수 있 는 기술 이 있 습 니 다.  1.  private 의 intance 변수+그의 get 방법 을 정의 합 니 다.Public/protected 의 intance 변 수 를 정의 하지 마 십시오.변 수 를 Public 로 정의 하면 대상 은 외부 에서 동기 화 방법의 통 제 를 피해 직접 그 를 얻 고 바 꿀 수 있 습 니 다.이것 도 자바 빈 의 표준 실현 방식 중의 하나 다.  2.  인 스 턴 스 변수 가 대상 이 라면 배열 이나 Array List 같은 방법 은 안전 하지 않 습 니 다.외부 대상 이 get 방법 을 통 해 이 인 스 턴 스 대상 의 인용 을 받 은 후에 다른 대상 을 가리 키 면 이 private 변수 도 변 합 니 다.위험 하지 않 습 니까?이 럴 때 get 방법 에 synchronized 동기 화 를 추가 하고 이 private 대상 의 clone()만 되 돌려 야 합 니 다.그러면 호출 단 에서 얻 은 것 은 대상 사본 의 인용 입 니 다.
본문 은 leofaith 의 블 로그.

좋은 웹페이지 즐겨찾기