자바 잠 금 분리
4352 단어 자바
/** Lock held by take, poll, etc */
private final ReentrantLock takeLock = new ReentrantLock();
/** Wait queue for waiting takes */
private final Condition notEmpty = takeLock.newCondition();
/** Lock held by put, offer, etc */
private final ReentrantLock putLock = new ReentrantLock();
상기 코드 는 takeLock 과 putLock 을 정의 합 니 다. 그들 은 각각 take () 와 put () 작업 에 대응 합 니 다. take () 와 put () 는 서로 독립 되 고 take (0 과 take () 경쟁 자물쇠, put () 와 put () 경쟁 자물쇠 입 니 다.
public E take() throws InterruptedException {
E x;
int c = -1;
final AtomicInteger count = this.count;
final ReentrantLock takeLock = this.takeLock;
takeLock.lockInterruptibly();//
try {
try {
while (count.get() == 0)
notEmpty.await();
} catch (InterruptedException ie) {
notEmpty.signal(); // propagate to a non-interrupted thread
throw ie;
}
x = extract();
c = count.getAndDecrement();
if (c > 1)
notEmpty.signal();
} finally {
takeLock.unlock();
}
if (c == capacity)
signalNotFull();
return x;
}
public void put(E e) throws InterruptedException {
if (e == null) throw new NullPointerException();
// Note: convention in all put/take/etc is to preset
// local var holding count negative to indicate failure unless set.
int c = -1;
final ReentrantLock putLock = this.putLock;
final AtomicInteger count = this.count;
putLock.lockInterruptibly();//
try {
/*
* Note that count is used in wait guard even though it is
* not protected by lock. This works because count can
* only decrease at this point (all other puts are shut
* out by lock), and we (or some other waiting put) are
* signalled if it ever changes from
* capacity. Similarly for all other uses of count in
* other wait guards.
*/
try {
while (count.get() == capacity)
notFull.await();
} catch (InterruptedException ie) {
notFull.signal(); // propagate to a non-interrupted thread
throw ie;
}
insert(e);
c = count.getAndIncrement();
if (c + 1 < capacity)
notFull.signal();
} finally {
putLock.unlock();
}
if (c == 0)
signalNotEmpty();
}
개념 이 너무 많아 오히려 이해 하기 어렵다. 여기 서 간단하게 자물쇠 분리 와 세그먼트 자 물 쇠 를 말한다. 우 리 는 Concurrent HashMap 과 같은 데이터 구 조 를 분석 합 니 다. 잠 금 분리 체 제 는 하나의 HashMap 을 여러 개의 segement 로 나 누 어 모든 segement 의 쓰기 작업 에 자 물 쇠 를 채 우 는 것 입 니 다. 그의 get ()조작 은 잠 겨 있 지 않 습 니 다. 구체 적 인 사상 은 모든 hash 슬롯 의 링크 의 머리 부분 을 final 로 설정 하 는 것 입 니 다. hash 슬롯 의 링크 조작 은 머리 에서 만 처리 할 수 있 습 니 다. 그러면 읽 기 가 일치 하지 않 는 상황 이 발생 하지 않 습 니 다. 이 원 리 는 소스 코드 를 보 는 것 이 좋 습 니 다. 비교적 뚜렷 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.