Java 동시 프로그래밍 디스플레이 잠금 ReentrantLock 및 ReadWriteLock 읽기와 쓰기 잠금
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();
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.