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

标签 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;
    }

由于我要多个线程同时读取数据,所以我没有同步整个方法。但是,向字典中插入数据应该是同步的。

我不会存储空值。

附言有人可以举例说明它们之间的区别吗?

最佳答案

使用ConcurrentHashMap

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

为了提供高并发性,实现在内部管理自己的同步。因此,不可能从中排除并发 Activity ,锁定它只会减慢程序速度。

ConcurrentHashMap 针对检索操作进行了优化,例如 getConcurrentHashMap 扩展了 Map 并添加了几个 方法,包括 putIfAbsent(key, value),它为 如果不存在则返回一个键并返回与该键关联的先前值, 或 null 如果没有。这使得实现线程安全映射变得容易。

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

有关更多信息,我建议阅读 Effective Java .

关于java - 我应该使用 HashTable 还是 HashMap 作为数据缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20356354/

相关文章:

java - Servlet - java.lang.IllegalStateException : getWriter() has already been called for this response

java - 有没有办法在测试之间停止 micronaut 计划的工作?

java - 为什么此代码不会导致 ConcurrentModificationException?

java - HashMaps 和 Null 值?

java - 如何使用HashMap忽略字符串中的空格、大写字母和标点符号?

java - 导出为 war 时 Eclipse 不包括我的 javascript 文件

javascript - Safari 将 URL # 片段合并到其浏览器缓存中

javascript - YSlow 说我的 JavaScript 文件在合并 5 个文件并打包后不再缓存

linux - 使用命令 'dentunusd' 时关于 'sar' 的一些问题?

java - 尝试向另一个类中的 GUI 显示 HashMap 值