【发布时间】:2017-12-10 19:30:08
【问题描述】:
我有以下列表。
List<Map<String,String>> input = new ArrayList<Map<String,String>>();
我有一个要求,在线程中访问 List 中的每个 Map 对象。 保证没有两个线程访问同一个映射对象。
for(Map<String,String> input : inputList){
triggerThread(input); // Thread modifies the input. It adds elements in the input map
}
我需要使用 synchronizedList(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");
}
}
【问题讨论】:
-
你不能在循环遍历列表时修改它,你会得到一个 ConcurrentModificationException。为此使用迭代器。您仍然需要同步。
-
示例代码从不修改列表,因此永远不会抛出 ConcurrentModificationException。
-
这里我只是在修改列表中的对象。我没有在列表中删除或添加元素。所以我们可能不会得到 ConcurrentModificationException。你能帮我同步列表吗?
-
@Teja,你能把
triggerThread ()的代码贴出来吗? -
它还取决于您何时、何地以及如何创建相对于从中读取的线程的列表。如果不查看您的所有代码,我认为我们无法准确回答您的问题。见stackoverflow.com/help/mcve。
标签: java multithreading concurrency java-threads