[英]Should I use HashTable or HashMap as a data cache?
我想在內存中創建一個數據緩存,這樣我就不必每次都查詢數據庫。
字典最初將為空,並且在從中請求數據時將填充該字典。
為此,字典應該是HashTable還是HashMap?
ConcurrentHashMap或synchronizedMap會更好嗎?
為了我的目的,請解釋為什么X比Y好。 我試圖了解它們之間的差異。
//variable for locking purposes.
private String LOCK = new String("LOCK");
//HashMap or HashTable?
private HashMap<Long, Long> dictionary = new HashMap<Long, Long>();
public Long getValue(Long key) throws SQLException{
Long value = dictionary.get(key);
if(value != null)
return value ;
synchronized (LOCK) {
//Check again to make sure another thread hasn't populated the dictionary
key = dictionary.get(key);
if(key != null)
return value;
//Get value from database
//store in map for future use
dictionary.put(key, value);
}
return value;
}
由於我希望多個線程同時讀取數據,因此我沒有同步整個方法。 但是,應該同步將數據插入字典。
我不會存儲空值。
PS有人可以用實例解釋它們之間的差異嗎?
使用ConcurrentHashMap
它提供標准Map
接口的高性能並發實現。
為了提供高並發性,實現在內部管理自己的同步。 因此,不可能從中排除並發活動,鎖定它將不起作用,但會減慢程序。
ConcurrentHashMap
針對檢索操作進行了優化,例如get
。 ConcurrentHashMap
擴展了Map
並添加了幾個方法,包括putIfAbsent(key, value)
,如果沒有鍵,則插入鍵的映射並返回與鍵關聯的先前值,如果沒有則返回null
。 這樣可以輕松實現線程安全的映射。
除了提供出色的並發性外,ConcurrentHashMap非常快。 除非你有令人信服的理由,否則使用ConcurrentHashMap
優先於Collections.synchronizedMap
或Hashtable
。 簡單地用並發映射替換舊式同步映射可以顯着提高並發應用程序的性能。
有關更多信息,我建議閱讀Effective Java 。
為什么不查看像ehcache( http://ehcache.org/ )這樣的緩存API。 此外,如果您的數據增長到千兆級別,那么您甚至可以與BigMemory鏈接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.