java - 并发访问Java中的Map列表

标签 java multithreading concurrency java-threads

我有以下列表。

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

我有一个要求在线程中访问列表中的每个Map对象。
确保没有两个线程访问同一 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()

    关于java - 并发访问Java中的Map列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47742617/

    相关文章:

    java - 指定Java虚拟机的内存限制有什么好处?

    java - 在java中初始化final字段的奇怪行为

    java - CSRF守卫 : How to hide CSRF token from URL

    c# - HttpWebRequest 在另一个线程中返回请求的结果 (Monotouch)

    c - 同步所有事件线程C并一一释放?

    c - 为什么 Apache MPM prefork.c 使用互斥量来保护 accept()?

    java - 可直接访问的数据结构 Java

    发出并发请求时,php curl localhost 很慢

    java - 寻找使用 PrintWriter 的指南

    asp.net-mvc - 即使禁用 session ,ASP.NET MVC 5 并发请求也会排队