当前位置: 首页 > 面试题库 >

Hashmap并发问题

常子濯
2023-03-14
问题内容

我有一个Hashmap,出于速度原因,我不想锁定。假设我不介意过时的数据,那么更新并同时访问它会引起任何问题吗?

我的访问是获取,而不是遍历访问,而删除是更新的一部分。


问题答案:

同步或使用ConcurrentHashMap的重要性不可低估。

直到几年前,我还处于一种误导的印象中,我只能通过同步HashMap上的放置和删除操作就可以摆脱困境。这当然是非常危险的,实际上会在某些(我认为是1.5)jdk的HashMap.get()中导致无限循环。

我几年前做过的事情(实际上不应该做):

public MyCache {
    private Map<String,Object> map = new HashMap<String,Object>();

    public synchronzied put(String key, Object value){
        map.put(key,value);
    }

    public Object get(String key){
        // can cause in an infinite loop in some JDKs!!
        return map.get(key);
    }
}

编辑:以为我会添加一个示例,该怎么办(见上文)



 类似资料:
  • 我有一个类(我们称之为XClass),它有一个我正在测试的方法(我们称之为xMethod)。它还包含一个: 在我的单元测试设置方法中,我有: 在测试方法中,我创建了几个(在我的例子中是8个)线程。它们的run方法调用XClass.XMethod。此方法更改静态映射变量。方法xMethod应该调用Map.ContainsKey()Map.Get()和Map.Put()8次。它不执行任何删除操作。这个

  • 当使用并发hashmap时,我是否需要将put环绕在一个同步块上,是否存在竞争条件:

  • 本文向大家介绍Java HashMap源码及并发环境常见问题解决,包括了Java HashMap源码及并发环境常见问题解决的使用技巧和注意事项,需要的朋友参考一下 HashMap源码简单分析: 1 一切需要从HashMap属性字段说起: 2: 接下来查看一下HashMap的put方法: 3 put中调用的inflateTable方法: 4 put方法中调用的indexFor方法: 5 put方法中

  • 我需要双键并发hashmap。 我的第一次尝试只是使用java.util.concurrent.ConTrentHashMap。像这样 但我觉得这很难看。 我的第二次尝试是使用对象作为键。像这样 最后一次尝试是创建DualkeyConcurrentHashMap。我只需要放,拿,康纳斯基。 它更好,而且完全线程安全吗?(我不能确定所有方法都需要同步。) 还有其他推荐的方法吗?

  • 问题内容: 我知道这不是线程安全的,但是我不确定其确切含义。 在和都使用的情况下,以下哪种情况会引起问题并需要同步? 两个线程同时读取相同的索引 假设您不在乎获取旧元素还是新元素,则替换尝试同时访问的元素。 问题答案: 两个线程同时读取相同的索引 如果 列表是由分支and 的线程构造的,并且列表在线程被分支之前已完全构建并加载,则可以从公共线程读取多个线程。 这样做的原因是,使用线程和派生该线程的

  • 假设,我有如下 concurrentHashMap 代码: 此 方法是从多个线程调用的,可以尝试同时更新同一 accountId 的数量。 如何确保currentBalance在< code>get和< code>put之间不发生变化?因为根据我的理解,如果线程在执行< code>get后抢占,同时其他线程更新余额,< code>put将使用旧余额执行更新。