注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

罔少年

QQ 332256483

 
 
 

日志

 
 

CopyOnWriteArrayList  

2015-05-25 16:42:26|  分类: java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
JAVA中“=”操作只是将引用和某个对象关联
List在遍历的时候,如果被修改了会抛出java.util.ConcurrentModificationException错误。

下面这段代码运行的时候就会抛出java.util.ConcurrentModificationException错误。这是因为主线程在遍历list的时候,子线程在向list中添加元素。

import java.util.ArrayList;
import java.util.List;

public class Resource3 {

public static void main(String[] args) throws InterruptedException {
List<String> a = new ArrayList<String>();
a.add("a");
a.add("b");
a.add("c");
final ArrayList<String> list = new ArrayList<String>(
a);

//add元素到list
Thread t = new Thread(new Runnable() {
int count = -1;

@Override
public void run() {
while (true) {
list.add(count++ + "");
}
}
});
t.setDaemon(true);
t.start();
Thread.currentThread().sleep(3);

//读取list元素
for (String s : list) {
System.out.println(s);
}
}
}


如何避免 -----  CopyOnWriteArrayList
CopyOnWriteArrayList类最大的特点就是,在对其实例进行修改操作(add/remove等)会新建一个数据并修改,修改完毕之后,再将原来的引用指向新的数组。这样,修改过程没有修改原来的数组。也就没有了ConcurrentModificationException错误。

使用:

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

public class Resource3 {

public static void main(String[] args) throws InterruptedException {
List<String> a = new ArrayList<String>();
a.add("a");
a.add("b");
a.add("c");

//使用CopyOnWriteArrayList来复制一个list

final CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<String>(a);
Thread t = new Thread(new Runnable() {
int count = -1;

@Override
public void run() {
while (true) {
list.add(count++ + "");
}
}
});
t.setDaemon(true);
t.start();
Thread.currentThread().sleep(3);
for (String s : list) {
System.out.println(list.hashCode());
System.out.println(s);
}
}
}

输出结果:

669661746
a
2119153548
b
471684173
c
550648901
-1
-76447331
0
1638154873
1
921225916
2
1618672031
3
1404182932
4
950140076
5
-610377050
6
-610377050
7
-610377050
8
-610377050
9
-610377050
10
-610377050
11
-610377050
12



转载至:http://blog.csdn.net/imzoer/article/details/9751591



  评论这张
 
阅读(53)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018