java - 处理 List 上的并发修改而不会出现 ConcurrentModificationException

标签 java list java.util.concurrent

我有一个有状态 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/

相关文章:

java - 等待异步回调完成并传递值

java - 如何仅检测用户在 EditText 中的输入?

java - 当 session 对象不是静态时无法运行数据库查询?

java - SQLite异常,数据库已关闭

python - 如何在jinja2中获取带有空格的整个字符串

android - 服务中的位置查找器被信号量阻止?

java - 使用 scene2d 在 libgdx 中居中选择框文本

java - 将 Spring 3.1 与 Hibernate 4.0.1 一起使用时,如何解决 java.lang.ClassNotFoundException : org. hibernate.util.DTDEntityResolver?

python - Pandas - 检查列表列中的字符串列是否行

python - 如何遍历嵌套循环并枚举