Java8-本地缓存
轉載自?Java8-本地緩存
這里我將會給大家演示用ConcurrentHashMap類和lambda表達式實現一個本地緩存。因為Map有一個新的方法可以在key為Null的時候自動計算一個新的value值。非常完美的實現cache。來看下代碼:
| 12345678910111213141516 | publicstatic void main(String[] args) {????for(inti = 0; i < 10; i++)????????System.out.println(????????????"f("+ i + ") = " + fibonacci(i));}staticint fibonacci(inti) {????if(i == 0)????????returni;????if(i == 1)????????return1;????System.out.println("Calculating f(" + i + ")");????returnfibonacci(i - 2) + fibonacci(i - 1);} |
當然,這種方式很傻瓜了。即使對于一個非常小的數,例如fibonacci(5),上面的代碼打印出很多行,而且都是在進行重復計算,輸出如下(只截取一部分):
| 12345678910111213 | 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的創建如下:
| 1 | staticMap<Integer, Integer> cache = newConcurrentHashMap<>(); |
(譯者注:這種寫法在Java8中是允許的)
聲明cache之后,通過Map.computeIfAbsent() 方法,可以在key所對應的value值不存在的情況下,計算一個新的value值。超高速緩存(Caching)!由于這個方法是自動執行的,而且我們使用了 ConcurrentHashMap對象,這個緩存是線程安全的,不需要手動的去寫同步方法。另外,它不僅僅可以處理斐波那契額數列,在其他地方也可以被重復使用。
不過現在,我們看看如何在fibonacci()方法中使用緩存。
| 1234567891011 | staticint fibonacci(inti) {????if(i == 0)????????returni;????if(i == 1)????????return1;????returncache.computeIfAbsent(i, (key) ->?????????????????fibonacci(i - 2)???????????????+ fibonacci(i - 1));} |
瞧瞧。不能比這個再簡單了吧。想要證明嗎?好吧,每當我們計算一個新值的時候,都在控制臺輸出信息:
| 1234567891011121314 | staticint fibonacci(inti) {????if(i == 0)????????returni;????if(i == 1)????????return1;????returncache.computeIfAbsent(i, (key) -> {????????System.out.println(????????????"Slow calculation of " + key);????????returnfibonacci(i - 2) + fibonacci(i - 1);????});} |
程序輸出如下:
| 123456789101112131415161718 | f(0) = 0f(1) = 1Slow calculation of 2f(2) = 1Slow calculation of 3f(3) = 2Slow calculation of 4f(4) = 3Slow calculation of 5f(5) = 5Slow calculation of 6f(6) = 8Slow calculation of 7f(7) = 13Slow calculation of 8f(8) = 21Slow calculation of 9f(9) = 34 |
在Java7下又如何實現呢?
這樣代碼就會多一些,我們可以使用double-checked locking來實現:
| 12345678910111213141516171819202122232425 | staticint fibonacciJava7(inti) {????if(i == 0)????????returni;????if(i == 1)????????return1;????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);????????????}????????}????}????returnresult;} |
注:你實際的解決方案很可能會用到Guava Caches。
總結:Lambdas 表達式是Java8中非常重要的一部分。我們不要忘記添加到庫中的所有的新特性。
原文鏈接:? Jooq ?翻譯:? ImportNew.com? -? 踏雁尋花譯文鏈接:? http://www.importnew.com/10227.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的Java8-本地缓存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 避免代码冗余,使用接口和泛型重构Java
- 下一篇: 美国财政部税务大棒砸向微软,要求其补缴近