Java 동시 프로그래밍 디스플레이 잠금 ReentrantLock 및 ReadWriteLock 읽기와 쓰기 잠금

Java5.0 이전에는synchronized(내장 자물쇠)와volatile만 있었습니다.Java5.0 이후 ReentrantLock 이 표시됩니다.
ReentrantLock 개요
ReentrantLock은 재입력 가능한 자물쇠입니다. 내장 자물쇠와는 달리 사용할 때마다 표시되는 자물쇠와 해제가 필요하며 더 높은 기능을 제공합니다. 공평 자물쇠, 정시 자물쇠, 조건 자물쇠, 윤문 자물쇠, 중단 자물쇠입니다.사쇄의 활동성 문제를 효과적으로 피할 수 있다.ReentrantLock이 구현되었습니다.
Lock 커넥터:

  public interface Lock {
          //
          void lock();

          //
          void lockInterruptibly() throws InterruptedException;

          // ,
          boolean tryLock();

          // , ,
          boolean tryLock(long time, TimeUnit unit) throws InterruptedException;

          void unlock();

          //
          Condition newCondition();
  }

Lock 사용

        Lock lock = new ReentrantLock();
        lock.lock();
        try{
            //
        }finally{
            // , finally
            //
            lock.unlock();
        }
 
ReentrantLock 기능
윤문 자물쇠의 정시 자물쇠
폴링 및 정시 잠금 요청은 tryLock () 방법을 통해 이루어지며 무조건 잠금을 가져오는 것과 다르다.ReentrantLock에는 유연한 내결함성 메커니즘이 있습니다.자물쇠의 많은 상황은 순서대로 자물쇠를 잠그기 때문에 서로 다른 라인이 자물쇠를 얻으려고 시도할 때 막히고 자신이 이미 가지고 있는 자물쇠를 방출하지 않기 때문에 마지막에 자물쇠를 잠그게 된다.tryLock () 방법은 자물쇠를 얻으려고 할 때, 자물쇠가 다른 라인에 이미 소지되어 있다면, 설정 방식에 따라 즉시 되돌려줍니다. 계속 막지 않고 기다린 후에 자신이 가지고 있는 자물쇠를 방출합니다.되돌아오는 결과에 따라 다시 시도하거나 취소할 수 있으며 자물쇠가 사라지는 것을 피할 수 있다.
공평성
ReentrantLock 구조 함수에서 공평성 자물쇠와 비공평성 자물쇠(기본값) 두 가지 선택을 제공합니다.이른바 공평한 자물쇠라는 라인은 그들이 요청한 순서에 따라 자물쇠를 얻고 새치기를 허락하지 않는다.그러나 비공평한 자물쇠에 삽입을 허용합니다. 한 라인에서 자물쇠를 가져오는 요청이 발생할 때, 이 자물쇠가 사용할 수 있다면, 이 라인은 대기열에서 기다리는 라인을 건너뛰고 자물쇠를 얻을 수 있습니다.우리는 일반적으로 모든 자물쇠가 비공평하기를 바란다.자물쇠 추가 조작을 실행할 때 공평성은 스레드가 끊기고 복구될 때 지출로 인해 성능을 크게 떨어뜨리기 때문이다.이런 상황을 고려한다. A라인은 자물쇠를 가지고 있고 B라인은 이 자물쇠를 요청하기 때문에 B라인이 걸린다.A라인이 이 자물쇠를 놓을 때 B라인이 깨어나기 때문에 다시 자물쇠를 가져옵니다.이와 동시에 C 라인도 이 자물쇠를 가져오라고 요청합니다. 그러면 C 라인은 B 라인이 완전히 깨어나기 전에 이 자물쇠를 얻고, 사용하고, 방출할 수 있습니다.이것은 윈윈의 국면이다. B가 자물쇠를 얻는 시간(B가 깨어난 후에야 자물쇠를 얻을 수 있음)은 늦추지 않고 C가 더 일찍 자물쇠를 얻었고 흡수량도 높아졌다.대다수 상황에서 비공평한 자물쇠의 성능은 공평한 자물쇠의 성능보다 높다.
잠금 해제 작업 중단 가능
lockInterruptibly 방법은 자물쇠를 가져오는 동시에 중단에 대한 응답을 유지할 수 있기 때문에 다른 종류의 중단할 수 없는 차단을 만들 필요가 없습니다.
읽기 및 쓰기 잠금 ReadWriteLock
ReentrantLock은 표준 호환 자물쇠로 매번 최대 한 라인만 자물쇠를 소지할 수 있다.읽기와 쓰기 자물쇠가 다르기 때문에 두 개의 Lock 대상이 노출되었는데, 그 중 하나는 읽기 작업에 사용되고, 다른 하나는 쓰기 작업에 사용된다.

public interface ReadWriteLock {
    /**
     * Returns the lock used for reading.
     *
     * @return the lock used for reading.
     */
    Lock readLock();

    /**
     * Returns the lock used for writing.
     *
     * @return the lock used for writing.
     */
    Lock writeLock();
}

선택 가능한 구현:
1. 방출 우선
2. 읽기 스레드 새치기
3. 재입성
4. 강등
5. 업그레이드
ReentrantReadWriteLock은 ReadWriteLock 인터페이스를 실현하고 구조기는 공평한 자물쇠와 비공평한 자물쇠 두 가지 창설 방식을 제공한다.읽기와 쓰기 자물쇠는 읽기와 쓰기가 적은 경우에 적용되어 더욱 좋은 병발성을 실현할 수 있다.
 
예제

public class ReadWriteMap<K, V> {
    private Map<K, V> map;
    private final ReadWriteLock lock = new ReentrantReadWriteLock();

    private final Lock readLock = lock.readLock();
    private final Lock writeLock = lock.writeLock();

    public ReadWriteMap(Map<K, V> map) {
        this.map = map;
    }

    public V get(K key) {
        readLock.lock();
        try {
            return map.get(key);
        } finally {
            readLock.unlock();
        }
    }

    public void put(K key, V value) {
        writeLock.lock();
        try {
            map.put(key, value);
        } finally {
            writeLock.unlock();
        }
    }
}

좋은 웹페이지 즐겨찾기