>  기사  >  Java  >  Java 동시 프로그래밍의 명시적 잠금에 대한 자세한 설명

Java 동시 프로그래밍의 명시적 잠금에 대한 자세한 설명

零下一度
零下一度원래의
2017-06-25 10:26:451433검색

명시적 잠금

1. 잠금 및 재진입 잠금

잠금은 무조건적이고 폴링 가능하며 시간에 맞춰 중단할 수 있는 잠금 획득 작업을 제공합니다. 모든 잠금 및 잠금 해제 방법은 명시적입니다.

ReentrantLock은 잠금을 구현하며 동기화된 것과 동일한 메모리 의미도 제공합니다. reentrant 잠금 의미론 제공

 1. 기본 의미론:

void LockDefinition() {
        Lock lock = new ReentrantLock();try {//do someting//更新对象状态,捕获异常;并在必要时恢复不变性条件} finally {//finally中释放锁            lock.unlock();
        }
    }

 2. 폴링 잠금 및 시간 제한 잠금

  lock.tryLock([Long,TimeUnit]): 잠금을 획득하려고 시도하면 시간은 다음과 같습니다. a timed lock

 3. Interruptible lock 획득 연산

  lock.lockInterruptously();

두 번째, 공정성

 ReentrantLock은 공정한 잠금(잠금의 순차적 획득 요청)과 불공정한 잠금(큐 브레이킹)을 생성할 수 있습니다.

  큐 점프: 스레드가 불공정한 잠금을 요청할 때 요청이 이루어질 때 잠금 상태가 사용 가능한 경우 이 스레드는 큐에 들어가지 않지만 큐에서 대기 중인 모든 스레드를 건너뛰고 잠금을 획득합니다.

  참고: 불공정 잠금은 대기열 점프를 옹호하지 않지만 대기열 점프를 방지할 수는 없습니다. 반면 공정 잠금은 대기열에 배치되고 순차적으로 실행됩니다.

  경쟁이 치열할 때 불공정 잠금은 공정 잠금보다 빠릅니다. 이유는 재개입니다. 대기열의 스레드 스레드 실행 시작 사이에 심각한 지연이 있습니다

3. 읽기-쓰기 잠금

ReentrantLock은 표준 뮤텍스 잠금이지만 다음과 같은 일부 시나리오에서는 읽기와 읽기가 병렬로 수행될 수 있지만 불가능합니다.

ReadWriteLock 읽기-쓰기 잠금: 구현 ReentrantReadWriteLock: readLock 및 writeLock 메서드

1. 상호 작용 및 구현 방법

릴리스 우선 순위: 쓰기 잠금이 해제되고 대기열에 읽기와 쓰기가 모두 있는 경우 읽어야 합니다. 아니면 요청하는 스레드에 우선순위를 부여하시겠습니까?

 큐에서 읽기 스레드 점프: 현재 읽기 잠금을 기다리는 쓰기 잠금이 있는데, 후속 읽기 잠금이 대기열에서 점프하고 직접 읽어야 할까요? 직접 읽기는 동시성을 향상시키지만 쓰기 부족 및 획득 실패를 초래할 수 있습니다.

재진입: 읽기 잠금과 쓰기 잠금은 재진입이 가능합니까?

  강등: 쓰기 잠금, 스레드의 잠금을 다운그레이드할 수 있도록 잠금을 해제하지 않고 읽기 잠금을 획득할 수 있나요?

 업그레이드: 다른 대기 스레드보다 먼저 읽기 잠금을 쓰기 잠금으로 업그레이드할 수 있나요? 두 스레드가 동시에 쓰기 잠금을 업그레이드하려고 하면 교착 상태가 발생하기 쉽습니다

적용 대상: 주로 읽기 작업인 데이터 구조

위 내용은 Java 동시 프로그래밍의 명시적 잠금에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.