小心修改集合的大小
来源:互联网 发布:荧光定量pcr数据公式 编辑:程序博客网 时间:2024/05/01 23:00
Java中最常使用的就是集合了,而且处于性能的考虑,现在大部分人都不再使用Vector这种方法同步的集合了。新的集合库带来了更快的性能,同时也带来了更多错误使用的可能。新集合库性能的提升主要就是去掉了方法同步,可想而知,同步访问时必然存在数据一致性问题。为了能使程序不会因为数据的不一致而造成其它错误,新集合库在设计时采用了快速失败机制(Fast-Fail),就是每次遍历集合时都会判断当前集合大小是否被修改,如果被修改,马上抛出ConcurrentModificationException异常,停止程序继续运行。因此集合初始化完成后,应避免在另一处被修改大小。看下面这个例子:
package com.bhr.ioat.testcollection;
import java.util.*;
public class TestRemove
{
public static void main(String[] args)
{
Collection cltn = new ArrayList();
for(int i=0; i<100000; i++){
cltn.add(new Integer(i));
}
new OtherThread(cltn).start();
try{
Thread.sleep(1000); //sleep 1 second, in order to ensure the new thread start up.
}catch(Exception e){
e.printStackTrace();
}
Iterator it = cltn.iterator();
while(it.hasNext()){
Object obj = it.next();
cltn.remove(obj);
//it.remove();
System.out.println("Remove one element from collection");
break;
}
}
}
class OtherThread extends Thread
{
public Collection cltn_;
public OtherThread(Collection cltn){
cltn_ = cltn;
//cltn_ = (Collection)(((ArrayList)cltn).clone());
}
public void run(){
Iterator it = cltn_.iterator();
while(it.hasNext()){
Object obj = it.next();
System.out.println(obj);
}
}
}
程序很简单,开始初始化一个100000大小的ArrayList,然后传给另一个类,随后删除集合中的一个元素,你会发现马上就会抛出ConcurrentModificationException异常。
那是不是就不可以删除元素了?是不是应该继续使用Vector?当然不是,要不新集合的出现岂不是失去了意义。解决方法有两个,(1)集合只在一处被使用,这自然没有并发问题,不过还是不可以大胆修改,如果循环中删除集合中的元素,一定要调用Iterator的remove方法,而不是Collection的remove方法,前者删除后会修改Iterator的一个值,使得循环以为集合没被修改,可以继续进行,而调用后者没有修改Iterator中的值,继续循环同样会抛出异常。至于添加元素,Iterator中没有提供相应方法,所以如果在循环中添加,添加后就只能跳出循环了。(2)同一个集合在多处被使用,索性不要删除了,本来这种情况就不应该修改集合大小,如果你决得集合大小的修改不会影响程序的正常逻辑,那么使用时只好clone一个了。
上面只是实际中总结得一点经验,如果大家有更好得方法,可以交流一下。
- 小心修改集合的大小
- 小心修改集合的大小
- 小心数组的大小
- 修改UIImage的大小
- 修改AlertDialog的大小
- 修改UIImage的大小
- 修改UIImage的大小
- 修改UIImage的大小
- 修改sga_max_size的大小
- 不小心修改了系统的文件, 引起的错误.
- 查询不小心被误修改的数据
- 不小心删除或修改Xcode的某一库文件
- 不小心修改linux下/etc/sudoers权限的问题
- 修改ramdisk大小的方法
- 修改虚拟机的硬盘容量大小
- 修改vmware的硬盘大小
- 修改上传附件的大小
- 修改tcpdump的大小限制
- 架设安全的CVS服务器
- 使用Visual C#制作可伸缩个性化窗体
- Visual C#资源文件编程--创建资源文件
- XML4C完美兼容中文的补充
- 感受Longhorn之三
- 小心修改集合的大小
- HTML4.0语法教学
- 正则表达式
- SCEA之路--6. Enterprise JavaBeans
- 这是我们公司总结的一些关于中文乱码问题的一些解决方案和经验和大家分享!
- How To Use the ODBC .NET Managed Provider in Visual C# .NET and Connection Strings
- JSP的运行内幕
- 微软高级软件研发主管研修计划(Architect 2000)培训感想
- Dotnet WinForm 建立 FAQ (1)