簡體   English   中英

使用谷歌收藏MapMaker?

[英]Use of Google-collections MapMaker?

我剛剛在SO中看到了這個答案,其中提到Google收藏的MapMaker非常棒。我瀏覽了文檔,但無法弄清楚我可以在哪里使用它。任何人都可以指出某些情況會在哪里適合使用MapMaker。

這是我使用MapMaker的一種方式的快速示例:

private final ConcurrentMap<Long, Foo> fooCache = new MapMaker()
    .softValues()
    .makeComputingMap(new Function<Long, Foo>() {
          public Foo apply(Long id) {
            return getFooFromServer(id);
          }
        });

 public Foo getFoo(Long id) {
   return fooCache.get(id);
 }

當在地圖上調用get(id) ,它將返回該ID的映射中的Foo ,或者它將從服務器檢索它,緩存它並返回它。 一旦它成立,我就不必考慮它了。 另外,由於我已經設置了softValues() ,因此緩存無法填滿並導致內存問題,因為系統能夠根據內存需求清除緩存中的條目。 但是,如果從地圖中清除了緩存的值,它可以在下次需要時再次詢問服務器!

問題是,這只是一種可以使用的方式。 使地圖使用強,弱或軟鍵和/或值的選項,以及在特定時間后刪除條目的選項,可讓您使用它做很多事情。

如果您查看SoftReferenceWeakReference的描述可能會有所幫助。

SoftReference對於在緩存中使用非常有用,因為它們將在內存變低時被特別清除。

WeakReference告訴垃圾收集器它可以收集引用它的對象,只要在其他地方沒有強引用它。 這通常用於可以根據需要快速查找的內容。

因此,考慮使用MapMaker為緩存創建帶有softValues的ConcurrentMap,為臨時查找表創建帶有weakKeys的ConcurrentMap。

編輯:softValues使用LRU策略。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM