【发布时间】:2011-11-28 19:29:51
【问题描述】:
对于ArrayList 对象,有很多关于ConcurrentModificationException 的问题,但我还找不到我的问题的答案。
在我的servlet 中,我有一个 ArrayList 作为成员对象:
List myList<Object> = new ArrayList<Object> (...);
该列表必须在用户和会话之间共享。
在servlet 的方法之一method1 中,我需要迭代ArrayList 项,并最终在迭代后添加清除列表。这是一个sn-p:
for (Object o : myList) {
// read item o
}
myList.clear();
在另一种方法method2 中,我只是将一个新项目添加到列表中。
大多数情况下,该方法会在没有错误的情况下结束其工作。有时,可能由于不同用户同时调用此方法,我得到了著名的java util.ConcurrentModificationException 异常。
我应该将我的列表定义为:
List myList = Collections.synchronizedList(new ArrayList(...));
这就够了,还是我错过了什么?幕后是什么?当存在可能的并发时,容器是否将第二个线程保持在待机状态?
编辑:我已经为一些 cmets 添加了答案。
【问题讨论】:
-
首先,该列表真的应该在整个 web 应用程序的生命周期内在所有请求/会话之间共享吗?至于您的具体问题,请阅读其 Javadoc 以获得答案:docs.oracle.com/javase/6/docs/api/java/util/…
-
你能添加你的堆栈跟踪和代码sn-p吗?
-
@BalusC,我添加了更多信息
-
@ApacheFan,我添加了更多信息
标签: java multithreading servlets concurrency