打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Collections.synchronizedList引发的线程安全问题

Collections.synchronizedList引发的线程安全问题

 



有些容器是线程安全的(Vector,ConcurrentLinkedQueue等),有些则不是(list等),利用类

 

似 private static List<Task> taskQueue = Collections.synchronizedList(new 

 

LinkedList<Task>());的方法可以得到本身不是线程安全的容易的线程安全的状态,但是要注意

 

的是线程安全仅仅指的是如果直接使用它提供的函数,比如:queue.add(obj); 或者 

 

queue.poll(obj);,这样我们自己不需要做任何同步。

但如果是非原子操作,比如:

   1. if(!queue.isEmpty()) {  

   2.    queue.poll(obj);  

   3. }  

我们很难保证,在调用了isEmpty()之后,poll()之前,这个queue没有被其他线程修改。

所以对于这种情况,我们还是需要自己同步:

   1. synchronized(queue) {  

   2.     if(!queue.isEmpty()) {  

   3.        queue.poll(obj);  

   4.     }  

   5. }  

对于Collections.synchronizedList(new LinkedList<Task>()),

在返回的列表上进行迭代时,用户必须手工在返回的列表上进行同步:

List list = Collections.synchronizedList(new ArrayList()); ... synchronized(list) { 

 

Iterator i = list.iterator(); // Must be in synchronized block while (i.hasNext()) 

 

foo(i.next()); }

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
数据结构与算法:10 队列与多线程
.net中集合、容器(Collection)的这些事
CopyOnWriteArrayList与Collections.synchronizedList的...
关于Java集合,还停留在ArrayList、HashSet层面吗
.Net 集合数据类型总结
Collections.
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服