在我正在研究的多线程应用程序中,我们偶尔会看到ConcurrentModificationExceptions我们的列表(大多数情况下ArrayList,有时候是矢量).但是还有一些时候我认为并发修改正在发生,因为遍历集合似乎缺少项目,但没有抛出异常.我知道文档ConcurrentModificationException说你不能依赖它,但我怎样才能确保我不会同时修改List?并且在同步块中包装对集合的每个访问权限是防止它的唯一方法吗?
更新:是的,我知道Collections.synchronizedCollection,但它并没有防止有人在你迭代它时修改集合.我认为至少有一些问题发生在我正在迭代它时有人向集合添加内容时.
第二次更新 如果有人想结合提到的synchronizedCollection和像Jason那样的克隆,提到java.util.concurrent和像jacekfoo和Javamann这样的apache集合框架,我可以接受一个答案.
您最初的问题似乎是要求一个迭代器,该迭代器可以在保持线程安全的同时查看底层集合的实时更新。在一般情况下,解决这个问题的成本极其高昂,这就是为什么没有一个标准集合类能做到这一点。
有很多方法可以实现问题的部分解决方案,在您的应用程序中,其中一种可能就足够了。
Jason 给出了一种实现线程安全并避免抛出 ConcurrentModificationException 的具体方法,但这只是以牺牲活性为代价。
Javamann 提到了包中的两个特定类java.util.concurrent,它们以无锁方式解决了相同的问题,其中可伸缩性至关重要。这些仅随 Java 5 一起提供,但有各种项目将包的功能反向移植到早期的 Java 版本中,包括这个,尽管它们在早期的 JRE 中不会有如此好的性能。
如果您已经在使用某些 Apache Commons 库,那么正如 jacekfoo指出的那样,apache 集合框架包含一些有用的类。
您还可以考虑查看Google 集合框架。
| 归档时间: |
|
| 查看次数: |
5878 次 |
| 最近记录: |