스 레 드 동기 화-동기 화&잠 금

동기 화 실현 은 당연히 자 물 쇠 를 사용 합 니 다.자바 에서 자 물 쇠 를 사용 하 는 두 가지 기본 도 구 는 synchronized 와 Lock 입 니 다.
==========================================
synchronized
자바 언어의 키 워드 는 하나의 방법 이나 코드 블록 을 수식 할 때 같은 시간 에 최대 하나의 스 레 드 만 이 코드 를 실행 할 수 있 도록 합 니 다.
하나,두 개의 병렬 스 레 드 가 같은 대상 object 의 이 synchronized(this)동기 코드 블록 에 접근 할 때 한 시간 동안 하나의 스 레 드 만 실 행 될 수 있 습 니 다.다른 스 레 드 는 현재 스 레 드 가 이 코드 블록 을 실행 한 후에 야 이 코드 블록 을 실행 할 수 있 습 니 다.
2.그러나 하나의 스 레 드 가 object 의 synchronized(this)동기 코드 블록 에 접근 할 때 다른 스 레 드 는 이 object 의 비 synchronized(this)동기 코드 블록 에 접근 할 수 있 습 니 다.
3.특히 중요 한 것 은 하나의 스 레 드 가 object 의 synchronized(this)동기 코드 블록 에 접근 할 때 다른 스 레 드 가 object 의 모든 synchronized(this)동기 코드 블록 에 대한 접근 이 막 힐 것 입 니 다.
넷 째,세 번 째 예 는 다른 동기 코드 블록 에 도 적용 된다.즉,하나의 스 레 드 가 object 의 synchronized(this)동기 코드 블록 에 접근 할 때 이 object 의 대상 자 물 쇠 를 얻 었 다 는 것 이다.그 결과,다른 스 레 드 는 이 object 대상 의 모든 동기 코드 부분 에 대한 접근 이 일시 적 으로 차단 되 었 습 니 다.
5.synchronized 는 방법 과 코드 블록 에 어떤 차이 가 있 습 니까?
synchronized 는 방법 서명 에 사 용 됩 니 다.(test 를 예 로 들 면)어떤 스 레 드 가 이 방법 을 호출 할 때 이 인 스 턴 스 의 대상 자 물 쇠 를 가 져 옵 니 다.방법 이 끝나 지 않 을 때 까지 다른 스 레 드 는 기다 릴 수 밖 에 없습니다.이 방법 이 실 행 될 때 만 대상 자 물 쇠 를 풀 수 있 습 니 다.다른 스 레 드 만 이 자 물 쇠 를 선점 하고 방법 test 를 실행 할 수 있 습 니 다.그러나 이 모든 스 레 드 가 사용 하 는 같은 대상 인 스 턴 스 가 있어 야 서로 배척 하 는 현상 을 실현 할 수 있 습 니 다.그렇지 않 으 면 synchronized 키 워드 는 의 미 를 잃 게 됩 니 다.그러나 이 방법 이 클래스 방법,즉 수정자 가 static 이 라면 synchronized 는 이 방법 을 호출 하 는 스 레 드 가 현재 이러한 종류의 자 물 쇠 를 가지 고 있 음 을 의미 합 니 다.이 스 레 드 가 현재 방법 에서 계속 실행 되 기만 하면 다른 스 레 드 는 방법의 사용권 을 얻 을 수 없습니다!
6.스 레 드 가 이 코드 블록 에서 실행 되면 obj 대상 의 대상 잠 금 이 있 습 니 다.만약 에 여러 스 레 드 가 같은 Object 대상 을 공유 하면 이때 서로 배척 합 니 다!특히,obj==this 일 때 현재 이 방법 을 호출 하 는 인 스 턴 스 대상 을 표시 합 니 다.즉시
public void test(){...synchronized(this){//todo your code}...}이 때 그 효 과 는 public synchronized void test(){/to do your code}과 같 습 니 다.
synchronized 코드 블록 을 사용 하면 동기 화가 필요 한 코드 만 동기 화 할 수 있어 효율 을 크게 높 일 수 있 습 니 다.synchronized 에 대한 자세 한 설명 은 다음 블 로 그 를 참조 하 십시오.http://www.cnblogs.com/GnagWang/archive/2011/02/27/1966606.html
===========================================
Lock
1.Lock 은 synchronized 방법 과 문 구 를 사용 하 는 것 보다 더욱 광범 위 한 잠 금 작업 을 제공 합 니 다.이 는 보다 유연 한 구 조 를 허용 하고 차이 가 큰 속성 을 가 질 수 있 으 며 여러 개의 Condition 대상 을 지원 할 수 있 습 니 다.
2.자 물 쇠 는 여러 스 레 드 가 공유 자원 에 접근 하 는 것 을 제어 하 는 도구 입 니 다.일반적으로 자 물 쇠 는 공유 자원 에 대한 독점 접근 을 제공한다.한 번 에 하나의 스 레 드 만 자 물 쇠 를 얻 을 수 있 고 공유 자원 에 대한 모든 접근 은 먼저 자 물 쇠 를 가 져 와 야 합 니 다.그러나 일부 잠 금 은 ReadWriteLock 과 같은 공유 자원 에 대한 동시 접근 을 허용 할 수 있 습 니 다.
3.synchronized 방법 이나 문장의 사용 은 모든 대상 과 관련 된 암시 적 모니터 잠 금 에 대한 접근 을 제공 하지만 모든 잠 금 가 져 오기 와 방출 은 하나의 블록 구조 에 나타 나 도록 강제 합 니 다.여러 개의 잠 금 을 가 져 왔 을 때 반대 순서 로 풀 어야 하고 모든 잠 금 이 가 져 왔 을 때 와 같은 품사 범위 에서 모든 잠 금 을 풀 어야 합 니 다.
4.synchronized 방법 과 문장의 범위 체 제 는 모니터 잠 금 프로 그래 밍 을 사용 하 는 데 많은 편 의 를 주 었 고 자물쇠 와 관련 된 흔 한 프로 그래 밍 오 류 를 피 할 수 있 지만 가끔 은 더욱 유연 한 방식 으로 자 물 쇠 를 사용 해 야 한다.예 를 들 어 동시 방문 한 데이터 결 과 를 옮 겨 다 니 는 알고리즘 은'hand-over-hand'또는'chain locking'을 사용 해 야 합 니 다.노드 A 의 자 물 쇠 를 가 져 온 다음 에 노드 B 의 자 물 쇠 를 가 져 온 다음 에 A 를 풀 고 C 를 가 져 온 다음 에 B 를 풀 고 D 를 가 져 와 야 합 니 다.Lock 인터페이스의 실현 은 서로 다른 역할 범위 내 에서 자 물 쇠 를 가 져 오고 방출 할 수 있 으 며,어떠한 순서 로 든 여러 개의 자 물 쇠 를 가 져 오고 방출 할 수 있 도록 하여 이 기술 을 사용 할 수 있 습 니 다.
5.유연성 이 증가 함 에 따라 더 많은 책임 을 가 져 왔 다.블록 구조의 자 물 쇠 를 사용 하지 않 으 면 synchronized 방법 과 문 구 를 사용 할 때 나타 나 는 자물쇠 자동 방출 기능 을 잃 게 됩 니 다.대부분의 경우 다음 문장 을 사용 해 야 한다.
 Lock l = ...; 
 l.lock();
 try {
     // access the resource protected by this lock
 } finally {
     l.unlock();
 }

잠 금 및 취소 잠 금 이 서로 다른 역할 범위 에 나타 날 때 잠 금 을 유지 할 때 실행 되 는 모든 코드 를 try-finally 또는 try-catch 로 보호 하여 필요 할 때 잠 금 을 풀 수 있 도록 해 야 합 니 다.
6.Lock 은 synchronized 방법 과 문 구 를 사용 하 는 데 없 는 다른 기능 을 제공 합 니 다.이 는 블록 구조 가 아 닌 자물쇠 획득 시도(try Lock(),중단 가능 한 자 물 쇠 를 가 져 오 는 시도(lockInterruptibly()와 시간 초과 실효 자 물 쇠 를 가 져 오 는 시도(try Lock(long,TimeUnit)를 제공 합 니 다.
7.Lock 류 는 암시 적 모니터 자물쇠 와 전혀 다른 행위 와 의 미 를 제공 할 수 있 습 니 다.예 를 들 어 정렬,비 재 입 용법 또는 잠 금 검 측 을 확보 할 수 있 습 니 다.만약 어떤 실현 이 이런 특수 한 의 미 를 제공 했다 면,이 실현 은 반드시 이러한 의미 에 대해 기록 해 야 한다.
주의:
1.Lock 인 스 턴 스 는 일반적인 대상 일 뿐 그 자체 가 synchronized 구문 에서 목표 로 사용 할 수 있 습 니 다.Lock 인 스 턴 스 를 가 져 오 는 모니터 잠 금 은 이 인 스 턴 스 를 호출 하 는 모든 lock()방법 과 특별한 관계 가 없습니다.혼동 을 피하 기 위해 서 는 자신의 실현 을 제외 하고 이런 방식 으로 Lock 인 스 턴 스 를 사용 하지 않 는 것 을 권장 합 니 다.
2.별도의 설명 이 없 으 면 모든 매개 변수 에 null 값 을 전달 하면 NullPointer Exception 을 던 집 니 다.
3.ReentrantLock 은 synchronized 와 같은 동시성 과 메모리 의 미 를 가지 고 있 으 며 잠 금 중단 대기 와 정시 잠 금 대기 도 포함 되 어 있 습 니 다.이 는 스 레 드 A 가 대상 obj 의 자 물 쇠 를 먼저 얻 었 다 면 스 레 드 B 는 지 정 된 시간 동안 자 물 쇠 를 가 져 올 수 없 으 면 자동 으로 이 자 물 쇠 를 포기 합 니 다.그러나 synchronized 는 JVM 차원 에서 이 루어 지기 때문에 시스템 은 자물쇠 의 방출 여 부 를 감시 할 수 있 고 ReentrantLock 은 코드 를 사용 하여 이 루어 진 것 으로 시스템 은 자동 으로 자 물 쇠 를 방출 할 수 없 으 며 코드 에서 finally 자구 에서 자물쇠 lock.unlock()을 명시 적 으로 방출 해 야 합 니 다.
관련 실례 는 본인 의'라인 협업'블 로 그 를 참조 하 십시오.링크 는 다음 과 같 습 니 다.http://blog.csdn.net/lmb55/article/details/46274165
요약:
각각 천추 가 있 고,병발 량 이 비교적 적은 상황 에서 synchronized 를 사용 하 는 것 은 좋 은 선택 이지 만,병발 량 이 비교적 높 은 상황 에서 성능 저하 가 심각 하 다.이때 ReentrantLock 은 좋 은 방안 이다.

좋은 웹페이지 즐겨찾기