加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

相当于Java 7中的ComputeIfAbsent

发布时间:2020-12-15 03:04:24 所属栏目:Java 来源:网络整理
导读:有没有办法只在ConcurrentHashMap中不存在键时运行一段代码,并将代码的结果保存到集合中? 我不能使用Java 8功能,因为我正在为Android开发. 此外,我想避免运行长操作,如果我不需要,我不想打破集合的原子操作这样做. 解决方法 没有确切的等价物,但通常的方法
有没有办法只在ConcurrentHashMap中不存在键时运行一段代码,并将代码的结果保存到集合中?

我不能使用Java 8功能,因为我正在为Android开发.

此外,我想避免运行长操作,如果我不需要,我不想打破集合的原子操作这样做.

解决方法

没有确切的等价物,但通常的方法是这样的:
ConcurrentMap<Key,Value> map = ...

Value computeIfAbsent(Key k) {
  Value v = map.get(k);
  if (v == null) {
    Value vNew = new Value(...); // or whatever else you do to compute the value
    v = (v = map.putIfAbsent(k,vNew)) == null ? vNew : v;
  }
  return v;
}

这在功能上与Java 8中的computeIfAbsent调用相当,唯一的区别在于有时你构造一个永远不会进入map的Value对象 – 因为另一个线程首先放入它.它永远不会导致返回错误的对象或类似的东西 – 无论如何,函数始终返回正确的值,但如果Value的构造具有副作用*,则这可能是不可接受的.

额外的实例通常不是性能问题,因为初始的get()检查消除了对putIfAbsent的大多数调用.通常,这种方法比computeIfAbsent快得多,因为当对象已经存在时,该调用会对对象进行不必要的锁定.如果有些物体严重争用,我在本地测量它的速度要快5倍.

如果您确实需要集成到映射中的计算行为(保持内部锁定以便一个线程创建新对象),则可以使用Guava的CacheBuilder来获取LoadingCache.它与Java 8的CHM基本相同,但有大量额外的配置选项.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读