我有以下列表。
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
映射中的同一映射对象(如问题所述)如果是这种情况,则无需在
inputList
或input
上进行同步。另一方面,如果您将通过其他线程访问
inputList
本身,请使用Collections.syncrhonizedList()。
关于java - 并发访问Java中的Map列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47742617/