我想在内存中创建数据缓存,这样我就不必每次都查询数据库。
字典最初将为空,并且在从中请求数据时将填充该字典。
为此,字典应该是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;
}
由于我希望多个线程同时读取数据,因此我没有同步整个方法。但是,应该同步将数据插入字典中。
我不会存储空值。
P.S。有人可以用实例来解释它们之间的差异吗?
答案 0 :(得分:4)
使用ConcurrentHashMap
它提供标准Map
接口的高性能并发实现。
为了提供高并发性,实现在内部管理自己的同步。因此,不可能从中排除并发活动,锁定它将不起作用,但会减慢程序。
ConcurrentHashMap
针对检索操作进行了优化,例如get
。 ConcurrentHashMap
扩展Map
并添加了几个
方法,包括putIfAbsent(key, value)
,用于插入映射
一个密钥(如果没有)并返回与密钥关联的先前值,
或null
如果没有。这样可以轻松实现线程安全的映射。
除了提供出色的并发性外,ConcurrentHashMap非常快。除非你有令人信服的理由
否则,使用ConcurrentHashMap
优先于Collections.synchronizedMap
或Hashtable
。简单地用并发替换旧式同步映射
map可以显着提高并发应用程序的性能。
有关详情,建议您阅读Effective Java。
答案 1 :(得分:1)
为什么不查看像ehcache(http://ehcache.org/)这样的缓存API。此外,如果您的数据增长到千兆字节级别,那么您甚至可以与BigMemory链接。