Java 멀티스레드 프로그래밍(4장)

3292 단어

1. ReentrantLock 클래스


JDK1에서 Java 다중 스레드에서 synchronized 키워드를 사용하여 스레드 간의 동기화 배율을 실현할 수 있습니다.5에 ReentrantLock 클래스를 추가하면 같은 효과를 얻을 수 있고 기능이 더욱 강하다.
  • ReentrantLock 대상의 lock 방법으로 자물쇠를 가져오고 unlock 방법으로 자물쇠를 풀기
  • Condition 대상과 결합하여 대기/알림 모드를 실현하면 더욱 유연성을 가진다. 예를 들어 다중 알림 기능을 실현할 수 있다. 즉, 한 Lock 대상에서 여러 개의 Condition(즉 대상 모니터) 실례를 만들 수 있고 루트 대상은 지정된 Condition에 등록하여 루트 알림(즉 일부 루트 행위를 제어하는 것)을 선택적으로 진행할 수 있다.await 방법을 호출하려면 자물쇠를 가져와야 합니다 (lock 방법을 호출합니다)
  • Object류의 wait 방법은 Condition류의 await 방법과 같다.Object 클래스의 wait(long timeout) 방법은 Condition 클래스의 await(long time, TimeUnit unit) 방법과 같다.Object 클래스의 notify 방법은 Condition 클래스의 signal 방법과 같다.Object의 notifyAll 방법은 Condition 클래스의 singalAll 방법과 같다
  • 생산자/소비자 모델 구현:
  • 한 생산자, 한 소비자가while로if
  • 를 사용하지 않음
  • 여러 생산자, 여러 소비자가while로if를 사용하지 않고 가사 상황을 해결하고signalAll방법
  • 공평 자물쇠와 비공평 자물쇠: 공평 자물쇠는 라인이 자물쇠를 얻는 순서가 라인에 자물쇠를 추가하는 순서에 따라 분배된다는 것을 나타낸다. 즉, 선착순 모드이다.공평한 자물쇠가 아니라 자물쇠를 얻는 선점 메커니즘으로 무작위로 자물쇠를 얻는다.
  • getHoldCount () 방법은 현재 라인이 잠긴 개수를 유지합니다. 즉 lock () 방법을 호출한 횟수
  • getQueueLength () 방법은 이 잠긴 라인 개수를 가져오기를 기다리고 있는
  • 방법을 되돌려줍니다.
  • getWaitQueueLength(Condition condition)는 이 잠금과 관련된 condition을 기다리는 스레드 수
  • 를 반환합니다.
  • hasQueueThread(Thread thread) 방법으로 지정한 스레드가 이 잠금을 가져오기를 기다리고 있는지 조회하기
  • hasQueueThreads () 이 잠금을 가져올 라인이 있는지 알아보기
  • hasWaiters(Condition condition)는 이 잠금과 관련된condition을 기다리는 스레드가 있는지 확인합니다.
  • isFair()는 공정한 자물쇠인지 아닌지를 판단하고 기본적으로 비공평한 자물쇠
  • isHeldByCurrentThread () 현재 스레드가 이 잠금을 유지하는지 조회
  • isLocked() 이 잠금이 보유 중인지 확인
  • lockInterruptibly() 현재 스레드가 중단되지 않으면 잠금을 가져옵니다.중단된 경우 예외가 발생
  • tryLock()은 호출할 때 잠금이 다른 라인에 유지되지 않은 경우에만 잠금을 가져옵니다
  • tryLock(long timeout, Time Unit unit) 잠금이 지정된 대기 시간 동안 다른 스레드에 의해 유지되지 않고 현재 스레드가 중단되지 않으면 잠금 가져오기
  • awaitUninterruptibly ()await의 여부, 라인이 끊겼습니다. 계속 정상적으로 실행됩니다
  • awaitUntil(Date deadline)은 대기 시간이 되면 자동으로 깨울 수 있고, 대기 시간이 다가오면 미리 깨울 수 있다
  • 순서대로 인쇄할 수 있는ConditionA->conditionB->conditionC->conditionA 순환
  • 2. ReentrantReadWriteLock 클래스


    클래스 Reentrant Lock은 완전히 배타적인 효과가 있습니다. 즉, 같은 시간에 하나의 라인만 Reentrant Lock을 실행합니다.lock () 방법 뒤에 있는 작업입니다.읽기와 쓰기 자물쇠는 두 개의 자물쇠가 있는데 하나는 읽기와 관련된 자물쇠이고 공유 자물쇠라고도 하며 다른 하나는 쓰기 조작과 관련된 자물쇠이며 상호 배제 자물쇠라고도 한다.읽기와 쓰기는 서로 배척하지 않고, 읽기와 쓰기는 서로 배척한다.읽기 자물쇠
    ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
    lock.readLock().lock();
    // 
    lock.readLock().unlock();// finally 
  • 쓰기 자물쇠
  • ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
    lock.writeLock().lock();
    // 
    lock.writeLock().unlock();// finally 

    좋은 웹페이지 즐겨찾기