자바 캐 시 원리 와 인 스 턴 스

2307 단어 자바
자바 캐 시 원리 와 인 스 턴 스
원 리 는 매우 간단 하 다.데이터 가 필요 할 때마다 먼저 Map 에 가서 있 는 지 없 는 지 를 보고 있 으 면 꺼 내 고 없 으 면 데이터 베 이 스 를 찾 거나 인 스 턴 스 를 만들어 시스템 의 추가 비용 을 피한다.
의사 코드
아래 의 이 코드 는 다른 사람의 것 을 참고 하 는 것 이 고 기본 원리 와 과정 은 바로 이렇다.
다음 코드 의 해석 은?
안전 한 Concurrent HashMap 을 만 듭 니 다.get 방법 은 데 이 터 를 가 지 러 갈 때마다 가 져 오 면 바로 돌아 갑 니 다.만약 에 제 가 대상 을 잠 그 지 못 하면(여 기 는 읽 기와 쓰기 자 물 쇠 를 사용 하지 않 습 니 다.읽 기와 쓰기 자물쇠 가 잠 겨 있 으 면 모든 스 레 드 를 읽 을 수 있 고 읽 지 못 하면 원본 데이터 에서 가 져 옵 니 다.실제로 읽 기와 쓰기 자물쇠 가 잘 맞 으 면 실현 할 수 있 습 니 다.다만 비교적 번거롭다).그리고 데이터 원본 에서 가 져 옵 니 다.여기 의 데이터 원본 은 약 한 키 로 이 루어 진 Hash 표 입 니 다.weak 유지 보수 의 해시 표 는 정상 적 이지 않 을 때 표 의 대상 을 자동 으로 제거 하기 때문에 일부 자원 을 절약 할 수 있 습 니 다.put 는 말 하지 않 겠 습 니 다.너무 간단 합 니 다.

 package test;
 
import java.util.Map;
import java.util.WeakHashMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
 
public final class SimpleCache<K,V> {
 
    private final Lock lock = new ReentrantLock();
    private final int maxCapacity;
    private final Map<K,V> eden;
    private final Map<K,V> longterm;
 
    public SimpleCache(int maxCapacity) {
        this.maxCapacity = maxCapacity;
        this.eden = new ConcurrentHashMap<K,V>(maxCapacity);
        this.longterm = new WeakHashMap<K,V>(maxCapacity);
    }
 
    public V get(K k) {
        V v = this.eden.get(k);
        if (v == null) {
            lock.lock();
            try{
                v = this.longterm.get(k);
            }finally{
                lock.unlock();
            }
            if (v != null) {
                this.eden.put(k, v);
            }
        }
        return v;
    }
 
    public void put(K k, V v) {
        if (this.eden.size() >= maxCapacity) {
            lock.lock();
            try{
                this.longterm.putAll(this.eden);
            }finally{
                lock.unlock();
            }
            this.eden.clear();
        }
        this.eden.put(k, v);
    }
}


좋은 웹페이지 즐겨찾기