小编mit*_*shi的帖子

在Java中的ConcurrentHashMap中以原子方式写入后,我们能否实现对可变数据的读取?

我正在尝试找到这些答案,但无法在Google或Java文档中理解(或确认)它.

我的实现看起来像这样:

Map<String, POJO> map = new ConcurrentHashMap<String, POJO>();
Run Code Online (Sandbox Code Playgroud)

如果我做

value1 = map.get(key1);
value1.setProp(prop);
Run Code Online (Sandbox Code Playgroud)

任何其他线程可能会覆盖.

现在,我在想如果我喜欢以下内容:它会是一个原子操作/换句话说,它会阻止key1段吗?

map.compute(key1, (key1, value1) -> { value1.setProp(prop) });
Run Code Online (Sandbox Code Playgroud)

Javadoc的compute功能

尝试计算指定键及其当前映射值的映射(如果没有当前映射,则为null).整个方法调用以原子方式执行.其他线程在此映射上的某些尝试更新操作可能在计算进行时被阻止,因此计算应该简短,并且不得尝试更新此Map的任何其他映射.

参考文献:

1. https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html 2. https://docs.oracle.com/javase/8/docs/api/java /util/concurrent/ConcurrentHashMap.html#compute-K-java.util.function.BiFunction-

编辑:

对于我的最终实现,我做了类似这样的事情,因为所有线程共享NewMap,最后,我新的POJO列表
抽象数据类型

    public class NewMap {

        private Map<String, POJO> map;
        private boolean isUpdatable;
        void NewMap(){
              isUpdatable = true;
              map = new ConcurrentHashMap();
        }

        void putPOJOProp1(String key, Type value) throws ReadOnlyException{

                  map.compute(key, (k,v) -> {
                           if(!isUpdatable) throw new ReadOnlyException();
                           if(k == null){ 
                              POJO p = new POJO(); …
Run Code Online (Sandbox Code Playgroud)

java concurrenthashmap

12
推荐指数
2
解决办法
399
查看次数

标签 统计

concurrenthashmap ×1

java ×1