Java8 - 로컬 캐시

3275 단어 cachejava8lambda
ConcurrentHashMap 클래스와 lambda 표현식으로 로컬 캐시를 구현하는 것을 보여 드리겠습니다.맵은 키가 널일 때 새로운value 값을 자동으로 계산하는 새로운 방법이 있기 때문이다.아주 완벽하게 캐치를 실현했습니다.코드 보기:
public static void main(String[] args) {
    for (int i = 0; i < 10; i++)
        System.out.println(
            "f(" + i + ") = " + fibonacci(i));
}

static int fibonacci(int i) {
    if (i == 0)
        return i;

    if (i == 1)
        return 1;

    System.out.println("Calculating f(" + i + ")");
    return fibonacci(i - 2) + fibonacci(i - 1);
}

물론 이런 방식은 매우 바보스럽다.아주 작은 수, 예를 들어fibonacci(5)에 대해서도 위의 코드는 많은 줄을 출력하고 중복 계산을 하고 있으며 출력은 다음과 같다(일부분만 캡처한다).
Calculating f(6)
Calculating f(4)
Calculating f(2)
Calculating f(3)
Calculating f(2)
Calculating f(5)
Calculating f(3)
Calculating f(2)
Calculating f(4)
Calculating f(2)
Calculating f(3)
Calculating f(2)
f(6) = 8

우리가 하고 싶은 것은 피보나치 수열을 계산하기 위해 캐시를 만드는 것이다.가장 직접적인 방법은 캐시에 모든value 값을 저장하는 것입니다.cache 생성은 다음과 같습니다.
static Map<Integer, Integer> cache = new ConcurrentHashMap<>();

(역자주: 이런 쓰기 방법은java8에서 허용된다)
캐치를 선언한 후 Map.computeIfAbsent () 방법은 키에 대응하는value 값이 존재하지 않는 상황에서 새로운value 값을 계산할 수 있습니다.초고속 캐시(Caching)!이 방법은 자동으로 실행되고 ConcurrentHashMap 대상을 사용했기 때문에 이 캐시는 안전한 루트이기 때문에 수동으로 동기화 방법을 쓸 필요가 없습니다.또 피보나 수치열을 처리할 수 있을 뿐만 아니라 다른 곳에서도 중복 사용될 수 있다.
하지만 이제fibonacci () 방법에서 캐시를 사용하는 방법을 살펴봅시다.
static int fibonacci(int i) {
    if (i == 0)
        return i;

    if (i == 1)
        return 1;

    return cache.computeIfAbsent(i, (key) ->
                 fibonacci(i - 2)
               + fibonacci(i - 1));
}

봐봐.이보다 더 간단할 수는 없잖아.증명하고 싶으세요?좋습니다. 새로운 값을 계산할 때마다 콘솔에서 정보를 출력합니다.
static int fibonacci(int i) {
    if (i == 0)
        return i;

    if (i == 1)
        return 1;

    return cache.computeIfAbsent(i, (key) -> {
        System.out.println(
            "Slow calculation of " + key);

        return fibonacci(i - 2) + fibonacci(i - 1);
    });
}

프로그램 출력은 다음과 같습니다.
f(0) = 0
f(1) = 1
Slow calculation of 2
f(2) = 1
Slow calculation of 3
f(3) = 2
Slow calculation of 4
f(4) = 3
Slow calculation of 5
f(5) = 5
Slow calculation of 6
f(6) = 8
Slow calculation of 7
f(7) = 13
Slow calculation of 8
f(8) = 21
Slow calculation of 9
f(9) = 34

자바 7에서는 어떻게 이루어질까요?


이렇게 하면 코드가 좀 더 많아집니다. Double-checked locking을 사용하여 다음을 수행할 수 있습니다.
static int fibonacciJava7(int i) {
    if (i == 0)
        return i;

    if (i == 1)
        return 1;

    Integer result = cache.get(i);
    if (result == null) {
        synchronized (cache) {
            result = cache.get(i);

            if (result == null) {
                System.out.println(
                    "Slow calculation of " + i);

                result = fibonacci(i - 2)
                       + fibonacci(i - 1);
                cache.put(i, result);
            }
        }
    }

    return result;
}

주: 당신의 실제 해결 방안은 Guava Caches에 사용될 가능성이 높습니다.
요약: Lambdas 표현식은 Java8에서 매우 중요한 부분입니다.라이브러리에 추가된 모든 새로운 기능을 잊지 마십시오.
텍스트:http://blog.jooq.org/2014/02/28/java-8-friday-goodies-easy-as-pie-local-caching/

좋은 웹페이지 즐겨찾기