繁体   English   中英

并发访问Java中的Map列表

[英]Concurrent access of List of Map in Java

我有以下清单。

 List<Map<String,String>> input = new ArrayList<Map<String,String>>();

我有一个要求,在线程中访问列表中的每个Map对象。 确保没有两个线程访问同一地图对象。

for(Map<String,String> input : inputList){
    triggerThread(input); // Thread modifies the input. It adds elements in the input map
}

我是否需要使用syncedList(inputList)或synchronizedmap(input),还是可以直接使用输入映射而无需任何同步逻辑? 哪个设计好?

这可能是基本问题。 我对如何实施感到很困惑。

   class Main{
      public static void main(String[] args){
       List<Map<String,String>> inputList = new ArrayList<Map<String,String>>();
       Map<String,String> input = new HashMap<String,String>();
       input.put("attr1","param1");
       inputList.add(input);
       ExecutorService pool= Executors.newFixedThreadPool(10);
       for(Map<String,String> input : inputList){
         RequestHandler request = new RequestHandler(input);
         pool.submit(request);
        }
      }
   }

     class RequestHandler extends Runnable{
         Map<String,String> input;
         RequestHandler(Map<String,String> input){
           this.input=input;
         }
        @Override
         public void run() {
           //writing logic vaguely
           input.add("attr2", "param2");
        }
    }

假设以下内容:

  • inputList列表由一个线程填充,然后不被其他线程修改(即,没有添加/删除任何元素)
  • 没有两个线程访问input映射中的相同映射对象(如问题所述)

如果是这种情况,则无需在inputListinput上进行同步。

另一方面,如果您将通过其他线程访问inputList本身,请使用Collections.syncrhonizedList()例如。

由于列表从不改变,并且实际上是不可变的,因此您唯一需要考虑的就是Map元素。 一个线程对Map元素所做的更改可能对另一线程不可见。 为了解决这个问题,您可以使用ConcurrentHashMap:

例如:

    List<Map<String,String>> input = new ArrayList<>();
    input.add(new ConcurrentHashMap<>());
    ... 

作为参考,看看特别是关于能见度位

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM