我应该使用HashTable还是HashMap作为数据缓存?

时间:2013-12-03 16:21:49

标签: java caching hashmap hashtable

我想在内存中创建数据缓存,这样我就不必每次都查询数据库。

字典最初将为空,并且在从中请求数据时将填充该字典。

为此,字典应该是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。有人可以用实例来解释它们之间的差异吗?

2 个答案:

答案 0 :(得分:4)

使用ConcurrentHashMap

它提供标准Map接口的高性能并发实现。

为了提供高并发性,实现在内部管理自己的同步。因此,不可能从中排除并发活动,锁定它将不起作用,但会减慢程序。

ConcurrentHashMap针对检索操作进行了优化,例如getConcurrentHashMap扩展Map并添加了几个 方法,包括putIfAbsent(key, value),用于插入映射 一个密钥(如果没有)并返回与密钥关联的先前值, 或null如果没有。这样可以轻松实现线程安全的映射。

除了提供出色的并发性外,ConcurrentHashMap非常快。除非你有令人信服的理由 否则,使用ConcurrentHashMap优先于Collections.synchronizedMapHashtable。简单地用并发替换旧式同步映射 map可以显着提高并发应用程序的性能。

有关详情,建议您阅读Effective Java

答案 1 :(得分:1)

为什么不查看像ehcache(http://ehcache.org/)这样的缓存API。此外,如果您的数据增长到千兆字节级别,那么您甚至可以与BigMemory链接。