자바 효율 적 이 고 신축성 있 는 캐 시 만 들 기
2981 단어 자바
관건: 1 - Concurrent HashMap 세그먼트 잠 금.2 - Callable 시작 스 레 드, Future 대상 으로 돌아 갑 니 다.
코드:
public interface Computable {
V compute(K arg)throws InterruptedException;
}
public class Memoizer implements Computable {
private final Map> cache = new ConcurrentHashMap<>();
private Computable c=null;
public Memoizer(Computable c) { this.c = c; }
public V compute(final K arg) throws InterruptedException{
while(true){
Future f = cache.get(arg);
if(f==null){
Callable call = new Callable() {
@Override
public V call() throws InterruptedException {
return c.compute(arg);
}
};
FutureTask ft = new FutureTask(call);
f = cache.putIfAbsent(arg,ft);
if(f==null){
f = ft;
ft.run();
}
}
try{
return f.get();
}catch (CancellationException e){
cache.remove(arg,f);
}catch(ExecutionException e){
e.printStackTrace();
}
}
}
}
분석: 다 중 스 레 드 상황 에서 효율 적 인 캐 시 를 만 들 려 면 먼저 캐 시 중복 쓰기 와 중복 읽 기 문 제 를 고려 해 야 합 니 다.중복 쓰기 1: Concurrent HashMap 을 이용 하여 중복 쓰 기 를 해결 하고 같은 key 덮어 쓰 기 를 해결 하 는 동시에 세그먼트 잠 금 segment 가 더욱 정교 하고 데이터 동기 화 에 유리 합 니 다.2: 쓰기 전에 cache. get (arg) 에 스 레 드 가 기록 되 어 있 는 지 확인 합 니 다.3: Concurrent HashMap 을 통 해 cache. puutIfAbsent (arg, ft) 방법 을 기록 하지 않 고 원자 기록 (두 스 레 드 가 동시에 기록 되 는 것 을 방지 합 니 다.) 4: 기록 되면 계산 이 진행 되 기 를 기다 리 고 있 습 니 다. f. get () 은 결 과 를 되 돌 릴 때 까지 차단 상태 에 있 습 니 다.
교육 을 받 는 것 과 을 설명 하 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.