我有一个有状态 EJB,它调用 Web 解析页面的 EJB 无状态方法。
这是我的有状态代码:
@Override
public void parse() {
while(true) {
if(false == _activeMode) {
break;
}
for(String url : _urls){
if(false == _activeMode) {
break;
}
for(String prioritaryUrl : _prioritaryUrls) {
if(false == _activeMode)
break;
boursoramaStateless.parseUrl(prioritaryUrl);
}
boursoramaStateless.parseUrl(url);
}
}
}
这里没问题。
我有一些异步调用(使用 JMS),它们向我的 _urls 变量(列表)添加一些值。目标是在无限循环中解析新的 url。
当我尝试通过 JMS onMessage 方法在列表中添加新 url 时,我收到 ConcurrentModificationException,但它似乎正在工作,因为这个新 url 已被解析。
当我尝试包装同步块(synchronized block)时:
while(true){
synchronized(_url){
// code...
}
}
我的新网址从未被解析,我希望在 for() 循环完成后被解析...
所以我的问题是:当在循环内访问 List 时如何修改 List 而不会出现 ConcurrentModificationException ?
我只想让 2 个线程同时修改某些共享资源,而无需同步块(synchronized block)...
最佳答案
您可能想要 CopyOnWriteArrayList
.
关于java - 处理 List 上的并发修改而不会出现 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12565087/