我有一个有状态的 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 已被解析。
当我尝试包装同步块时:
while(true){
synchronized(_url){
// code...
}
}
我的新网址永远不会被解析,我希望在 for() 循环完成后被解析......
所以我的问题是:在没有 ConcurrentModificationException 的情况下,如何在循环内访问 List 时修改它?
我只想让 2 个线程在没有同步块的情况下同时修改一些共享资源......