需要有关Java Vector / ConcurrentModificationException同步的建议
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了需要有关Java Vector / ConcurrentModificationException同步的建议,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2683字,纯文字阅读大概需要4分钟。
内容图文
![需要有关Java Vector / ConcurrentModificationException同步的建议](/upload/InfoBanner/zyjiaocheng/731/c33fa4784f2f4f97b64fc6a50da0f3ce.jpg)
在遗留应用程序中,我有一个Vector,它按时间顺序保存要处理的文件列表,多个线程要求它处理下一个文件. (请注意,我意识到可能有更好的集合可供使用(随意提示),但我现在没有时间改变这种程度.)
在预定的时间间隔,另一个线程检查工作目录,以查看是否有任何文件因为出错而显示为孤立.如果系统异常繁忙,此线程调用的方法偶尔会抛出ConcurrentModificationException.所以我知道至少有两个线程试图同时使用Vector.
这是代码.我相信问题是在返回的Vector上使用clone().
private synchronized boolean isFileInDataStore( File fileToCheck ){
boolean inFile = false;
for( File wf : (Vector<File>)m_dataStore.getFileList().clone() ){
File zipName = new File( Tools.replaceFileExtension(fileToCheck.getAbsolutePath(), ZIP_EXTENSION) );
if(wf.getAbsolutePath().equals(zipName.getAbsolutePath()) ){
inFile = true;
break;
}
}
return inFile;
}
getFileList()方法如下:
public synchronized Vector<File> getFileList() {
synchronized(fileList){
return fileList;
}
}
作为一个快速修复,将更改getFileList方法以返回向量的副本,如下所示足够?
public synchronized Vector<File> getFileListCopy() {
synchronized(fileList){
return (Vector<File>)fileList.clone();
}
}
我必须承认,我通常会因为它与集合有关而使用Java中的synchronized,因为简单地声明这样的方法是不够的.作为一个额外的问题,是将方法声明为同步并将返回调用与另一个同步块一起包装,只是疯狂编码?看起来多余.
编辑:这是触摸列表的其他方法.
public synchronized boolean addFile(File aFile) {
boolean added = false;
synchronized(fileList){
if( !fileList.contains(aFile) ){
added = fileList.add(aFile);
}
}
notifyAll();
return added;
}
public synchronized void removeFile( File dirToImport, File aFile ) {
if(aFile!=null){
synchronized(fileList){
fileList.remove(aFile);
}
// Create a dummy list so I can synchronize it.
List<File> zipFiles = new ArrayList<File>();
synchronized(zipFiles){
// Populate with actual list
zipFiles = (List<File>)diodeTable.get(dirToImport);
if(zipFiles!=null){
zipFiles.remove(aFile);
// Repopulate list if the number falls below the number of importer threads.
if( zipFiles.size()<importerThreadCount ){
diodeTable.put(dirToImport, getFileList( dirToImport ));
}
}
}
notifyAll();
}
}
解决方法:
基本上,这里有两个不同的问题:sycnhronization和ConcurrentModificationException.与例如对比的矢量ArrayList在内部同步,因此add()或get()等基本操作不需要同步.但是,如果您在迭代Vector并在此期间修改它,甚至可以从单个线程获得ConcurrentModificationException,例如通过插入元素.因此,如果您在for循环中执行了修改操作,即使使用单个线程也可以破坏Vector.现在,如果您在类之外返回Vector,则不会阻止任何人在代码中没有正确同步的情况下修改它.原始版本的getFileList()中的fileList上的同步是没有意义的.返回副本而不是原始副本可能会有所帮助,因为可以使用允许在迭代时进行修改的集合,例如CopyOnWriteArrayList(但请注意修改的额外成本,在某些情况下可能是一个showstopper).
内容总结
以上是互联网集市为您收集整理的需要有关Java Vector / ConcurrentModificationException同步的建议全部内容,希望文章能够帮你解决需要有关Java Vector / ConcurrentModificationException同步的建议所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。