多线程中使用Java集合类
作者:网络转载 发布时间:[ 2013/2/27 9:59:38 ] 推荐标签:
Java集合类中,某个线程在 Collection 上进行迭代时,通常不允许另一个线性修改该 Collection。通常在这些情况下,迭代的结果是不确定的。如果检测到这种行为,一些迭代器实现(包括 JRE 提供的所有通用 collection 实现)可能选择抛出此异常。执行该操作的迭代器称为快速失败 迭代器,因为迭代器很快完全失败,而不会冒着在将来某个时间任意发生不确定行为的风险。
因此,当一个线程试图ArrayList的数据的时候,另一个线程对ArrayList在进行迭代的,会出错,抛出ConcurrentModificationException。
比如下面的代码:
final List<String> tickets = new ArrayList<String>();
for (int i = 0; i < 100000; i++) {
tickets.add("ticket NO," + i);
}
System.out.println("start1...");
for (int i = 0; i < 10; i++) {
Thread salethread = new Thread() {
public void run() {
while (tickets.size() > 0) {
tickets.remove(0);
System.out.println(Thread.currentThread().getId()+"Remove 0");
}
}
};
salethread.start();
}
System.out.println("start2...");
new Thread() {
public void run() {
for (String s : tickets) {
System.out.println(s);
}
}
}.start();
上述程序运行后,会在某处抛出异常:
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
at mytest.mytestpkg.Tj$2.run(Tj.java:138)
Vector是线程同步的,那么把ArrayList改成Vector是不是对了呢?
答案是否定的,事实上,无论是ArrayList还是Vector,只要是实现Collection接口的,都要遵循fail-fast的检测机制,即在迭代是时候,不能修改集合的元素。一旦发现违法这个规定会抛出异常。
--------------------------------------------------------------------------------
事实上,Vector相对于ArrayList的线程同步,体现在对集合元素是否脏读上。即ArrayList允许脏读,而Vector特殊的机制,不会出现脏读,但是效率会很差。
举个例子,一个集合,有10个线程从该集合中删除元素,那么每个元素只可能由一个线程删除掉,不可能会出现一个元素被多个线程删除的情况。
比如下面的代码:
final List<String> tickets = new ArrayList<String>();
for (int i = 0; i < 100000; i++) {
tickets.add("ticket NO," + i);
}
System.out.println("start1...");
for (int i = 0; i < 10; i++) {
Thread salethread = new Thread() {
public void run() {
while (true) {
if(tickets.size()>0)
System.out.println(Thread.currentThread().getId()+ tickets.remove(0));
else
break;
}
}
};
salethread.start();
}
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11