Spring ConcurrentReferenceHashMap簡單測試
ConcurrentReferenceHashMap是自spring3.2後增加的一個同步的軟(虛)引用Map。關於軟引用(SoftRefrence)和虛引用(WeakRefrence)可以參見java四種引用類型。廢話不多說直接上測試代碼:
@Test
public void test() throws InterruptedException {
String key = new String("key");
String value = new String("val");
Map<String, String> map = new ConcurrentReferenceHashMap<>(8, ReferenceType.WEAK);
map.put(key, value);
System.out.println(map);
key = null;
System.gc();
TimeUnit.SECONDS.sleep(5);
System.out.println(map);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
輸出結果:
神奇的事發生了。通過代碼我們可以看到。我先構建了一個虛引用的map對象(也就是本文主角ConcurrentReferenceHashMap),然後新建對象key,value並將兩個對象放入Map中進行保存。然後使key對象的強引用置爲null。然後調用系統GC。由於系統GC的特殊性質並不能保證系統立馬進行GC操作所已緊接着讓主線程睡眠5s。接着打印我們的map對象發現map中的對象自動被移除了。
接下來我不置空key而將value置空發現結果相同。
結論:
查看ConcurrentReferenceHashMap源碼發現起底層實現依賴的是RefrenceQueue完成自動移除操作。時間有限就寫到這裏。有時間再進行完善。