자바 동시 프로 그래 밍 테마(4)---간단 한 이야기(JUC)잠 금 자물쇠

먼저지난 절말 한 synchronized 키 워드 를 기억 해 보 겠 습 니 다.이 키 워드 는 코드 세그먼트 나 방법 에 자 물 쇠 를 채 워 서 어느 순간 에 수식 하 는 방법 이나 코드 세그먼트 가 하나의 스 레 드 에 만 접근 할 수 있 도록 합 니 다.그러면 우리 가 이러한 상황 을 만 났 을 때 synchronized 의 수식 방법 이나 코드 세그먼트 가 어떤 이유(IO 이상 또는 sleep 방법)로 막 혔 지만 자물쇠 가 풀 리 지 않 았 을 때 다른 스 레 드 는 기다 리 는 것 외 에는 아무것도 할 수 없습니다.우리 가 이런 상황 을 만 났 을 때 어떻게 해 야 합 니까?우리 가 오늘 말 한 Lock 자 물 쇠 는 이 를 위해 그의 직책 을 행사 할 기회 가 있 을 것 이다.
1.왜 잠 금 이 필요 한가
synchronized 는 자바 언어 차원 의 키워드 입 니 다.Lock 은 JDK 5 의 J.U.C(java/util/current)패키지 에 나타 난 클래스 로 사용 시 synchronized 동기 화 된 코드 블록 은 JVM 에서 자동 으로 방출 됩 니 다.Lock 은 finally 블록 에서 프로그래머 가 손 으로 풀 어야 합 니 다.synchronized 는 비교적 오래된 실현 체제 로 디자인 이 빠 르 고 기능 적 인 제한 이 있 습 니 다.
잠 금 을 기다 리 고 있 는 스 레 드 를 중단 할 수 없습니다.
투표 로 자 물 쇠 를 채 울 수도 없고 기다 리 고 싶 지 않 으 면 자 물 쇠 를 채 울 수도 없다.
―동기 화 자물쇠 의 방출 은 자물쇠 가 있 는 스 택 프레임 과 같은 스 택 프레임 에서 만 가능 합 니 다.
또한 다 중 스 레 드 환경 에서 synchronized 를 사용 한 후 스 레 드 는 자 물 쇠 를 얻 거나 해당 하 는 코드 를 실행 하거나 자 물 쇠 를 얻 지 못 하고 대기 상태 에 있 으 며 자물쇠 에 대한 처리 가 원활 하지 않 습 니 다.한편,Lock 은 여러 가지 잠 금 기반 처리 체 제 를 제공 했다.예 를 들 어:
  • void lock(),자 물 쇠 를 가 져 옵 니 다.현재 다른 스 레 드 에 의 해 잠 겨 있 으 면 현재 스 레 드 는 휴면 합 니 다
  • boolean tryLock(),자 물 쇠 를 가 져 오 려 고 시도 합 니 다.현재 자물쇠 가 다른 스 레 드 에 있 으 면 false 로 돌아 가 현재 스 레 드 를 휴면 시 키 지 않 습 니 다
  • boolean try Lock(long timeout,TimeUnit unit)은 잠 금 을 가 져 오 면 즉시 true 로 돌아 갑 니 다.다른 스 레 드 가 잠 금 을 가지 고 있 으 면 매개 변수 가 주어진 시간 을 기다 리 고 기다 리 는 과정 에서 잠 금 을 가 져 오 면 true 로 돌아 갑 니 다.시간 이 초과 되면 false 로 돌아 갑 니 다
  • void lockInterruptibly()는 잠 금 을 가 져 오 면 바로 돌아 갑 니 다.잠 금 을 가 져 오지 않 으 면 현재 스 레 드 가 휴면 상태 에 있 거나 잠 겨 있 거나 현재 스 레 드 가 다른 스 레 드 에 의 해 중단 되 었 습 니 다.
  • 이 를 통 해 알 수 있 듯 이 lock 은 synchronized 보다 더 가 는 입도 와 유연 한 통 제 를 제공 합 니 다.
    2.초기 잠 금
    jdk 1.5 이후 가방 에 Lock 인터페이스(및 관련 실현 클래스)를 추가 하여 잠 금 기능 을 실현 합 니 다.사실은 Lock 인 터 페 이 스 를 진정 으로 실현 하 는 클래스 는 세 가지 입 니 다.ReentrantLock 과 ReentrantReadWriteLock 의 두 내부 클래스(ReadLock 과 WriteLock 은 Lock 의 인 터 페 이 스 를 실현 합 니 다)입 니 다.다음은 Lock 의 유형 도 를 살 펴 보 겠 습 니 다.
  • ReentrantLock:다시 들 어 갈 수 있 는 상호 배척 자물쇠 로 lock 인터페이스의 주요 실현 입 니 다
  • ReentrantReadWriteLock:
  • ReadWriteLock,ReadWriteLock 은 관련 자 물 쇠 를 유지 하고 있 습 니 다.하 나 는 읽 기 전용 이 고 다른 하 나 는 기록 작업 에 사 용 됩 니 다
  • Semaphore:하나의 계수 신 호 량
  • Condition:자물쇠 의 관련 조건 은 스 레 드 가 자 물 쇠 를 가 져 올 수 있 도록 하고 기다 리 는 특정한 조건 이 만족 하 는 지 확인 하 는 것 이 목적 입 니 다
  • 4.567917.Cyclic Barrier:동기 보조 클래스 로 하나의 스 레 드 가 서로 기다 릴 수 있 도록 합 니 다.특정한 공공 장벽 에 도착 할 때 까지① 우선 Lock 의 사용법 을 살 펴 보 자.
    
      Lock lock = new ReentrantLock();
      lock.lock();
      try{
      //    
      }catch(Exception ex){
    
      }finally{
      lock.unlock();  //   
      }
    Lock 을 정상적으로 사용 하 는 용법 은 가장 많 습 니 다.ReentrantLock 은 Lock 의 실현 류 들 도 가장 많이 사용 합 니 다.Lock 을 사용 하면 자 물 쇠 를 자발적으로 풀 어야 하 며 이상 이 발생 했 을 때 자동 으로 자 물 쇠 를 풀 지 않 습 니 다.따라서 일반적으로 Lock 을 사용 하려 면 try{}catch{}블록 에서 진행 하고 finally 블록 에서 자 물 쇠 를 풀 어 잠 금 이 풀 리 지 않도록 해 야 합 니 다.
    ② 우리 도 Lock 을 이렇게 사용 할 수 있다.
    
    Lock lock = new ReentrantLock();
      if(lock.tryLock()) {
         try{
           //    
         }catch(Exception ex){
    
         }finally{
           lock.unlock();  //   
         } 
      }else {
        //       ,          
      }
    try Lock()방법 은 반환 값 이 있 습 니 다.자 물 쇠 를 가 져 오 려 고 시도 하 는 것 을 의미 합 니 다.성공 하면 true 로 돌아 갑 니 다.만약 에 자 물 쇠 를 가 져 오 는 데 실패 하면 false 로 돌아 갑 니 다.이 방법 은 어떻게 든 바로 돌아 갑 니 다.자 물 쇠 를 못 가 져 올 때 계속 기다 리 지 는 않 을 겁 니 다.
    이 절 에서 우 리 는 Lock 인 터 페 이 스 를 간단하게 알 아 보 자.Lock 자물쇠 의 내용 이 너무 많 기 때문에 상호 배척 자물쇠,공평 자물쇠,불공평 자물쇠,공유 자물쇠 와 관련 된 조건 체제,신 호 량 체제 등 을 포함한다.나 는 그들 을 조금씩 뜯 어 낼 것 이다.다음은 우리 의 중요 한 장면 이다.
    이상 은 자바 병렬 프로 그래 밍 테마(4)-간단 한 이야기(JUC)Lock 자물쇠 의 상세 한 내용 입 니 다.JAVA(JUC)LOCK 자물쇠 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 세 요!

    좋은 웹페이지 즐겨찾기