天天看點

Java8簡單的本地緩存實作

這裡我将會給大家示範用concurrenthashmap類和lambda表達式實作一個本地緩存。因為map有一個新的方法,在key為null的時候自動計算一個新的value值。非常适合實作cache。來看下代碼:

Java8簡單的本地緩存實作

當然,這種方式很傻瓜。即使對于一個非常小的數,例如fibonacci(5),上面的代碼也會列印出很多行,而且都是在進行重複計算,輸出如下(隻截取一部分):

我們想要做的就是建立一個緩存,用來計算斐波那契數列。最直接的方法就是在緩存中存放所有的value值。cache的建立如下:

static map<integer, integer> cache = new concurrenthashmap<>();

(譯者注:這種寫法在java8中是允許的)

聲明cache之後,通過map.computeifabsent() 方法,可以在key所對應的value值不存在的情況下,計算一個新的value值。超高速緩存(caching)!由于這個方法是自動執行的,而且我們使用了 concurrenthashmap對象,這個緩存是線程安全的,不需要手動的去寫同步方法。另外,它不僅僅可以處理斐波那契額數列,在其他地方也可以被重複使用。

不過現在,我們看看如何在fibonacci()方法中使用緩存。

Java8簡單的本地緩存實作

瞧瞧。不能比這個再簡單了吧。想要證明嗎?好吧,我們在每次計算一個新值的時候,加上些日志:

Java8簡單的本地緩存實作

程式輸出如下:

這樣代碼就會多一些,我們可以使用double-checked locking來實作:

Java8簡單的本地緩存實作

注:你實際的解決方案很可能會用到guava caches。

總結:lambdas 表達式是java8中非常重要的一部分。同時我們不要忘記那些新添加到庫中的,可以和lambdas 配合使用的特性。