黑马程序员技术交流社区
标题:
关于集合线程的安全
[打印本页]
作者:
柳彬
时间:
2012-9-29 00:10
标题:
关于集合线程的安全
集合中Vector是线程安全的,ArrayList,HashSet,TreeSet怎么证明他们的安全性,哪位高手举个例子说明哈,谢谢。。。
作者:
张飞年
时间:
2012-9-29 00:18
本帖最后由 张飞年 于 2012-9-29 00:22 编辑
ArrayList,HashSet,TreeSet都 是非同步 的,多个线程并发访问时有时会出现问题。我觉得对这个现象最有说服力就是迭代器的移除操作,这些集合只能是先成为一个序列固定之后再用迭代器的方法进行移除,,不然编译器不通过。
在单线程下是安全的,在多线程下得如编译器所说的那样来:如果多个线程同时访问一个 TreeSet,而其中至少一个线程修改了该 set,那么它必须 外部同步。这一般是通过对自然封装该 set 的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用 Collections.synchronizedSortedSet 方法来“包装”该 set。此操作最好在创建时进行,以防止对 set 的意外非同步访问: SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));
具休的代码我这会也举不出,呵。
作者:
柳彬
时间:
2012-9-29 00:43
张飞年 发表于 2012-9-29 00:18
ArrayList,HashSet,TreeSet都 是非同步 的,多个线程并发访问时有时会出现问题。我觉得对这个现象最有 ...
大哥能举个具体例子,用代码说话吗?程序员嘛,都是用代码说话
作者:
孙含庆
时间:
2012-9-29 02:04
Vector 和 ArrayList 在新Java版本下,他俩是同门师兄弟,就先说他俩吧。。
比如: 定义一个有20个元素的Vector 集合,再写个3线程的代码,并发来访问和修改Vector的元素。来执行他个几十次,
也不会出现什么问题。要是定义一个有20个元素的ArrayList 集合,再写上3线程的代码,同时来访问和修改ArrayList集合
的元素,执行几次就会出现异常问题。
可是关键是,写出了上面的代码,你也看不到为什么Vector安全。
用毕老师的方法,让你看看ArrayList 和Vector 集合的源代码定义你就明白了。
public class Vector<E>
extends AbstractList<E>
implements List<E>{
//下面是 Vector 集合的源代码,代码太多写不下,只给你看看这些方法定义 ,就不写方法体了
public synchronized void copyInto(Object[] anArray) {}
public synchronized void trimToSize() {}
public synchronized void ensureCapacity(int minCapacity) {}
public synchronized void setSize(int newSize) {}
public synchronized int capacity() {}//
上面那几个没用过,下面这几个总用过吧。
public synchronized int size() {}
public synchronized boolean isEmpty() {}
public synchronized int indexOf(Object o, int index) {}
public synchronized int lastIndexOf(Object o) {}
public synchronized E firstElement() {}
.............../
/可以看到,Vector的几乎所有方法都是 synchronized 修饰的,这可是超级安全的大铁门呀。
}
public class ArrayList<E> extends AbstractList<E>
implements List<E>{
//下面是ArrayList的源代码部分。
public void trimToSize() {}
public void ensureCapacity(int minCapacity) {}
private void grow(int minCapacity) {}
public boolean contains(Object o) {}
public int indexOf(Object o) {}
public int lastIndexOf(Object o) {}
public boolean add(E e) {}
public void add(int index, E element) {}//
可以看到ArrayList 这哥们一是一点儿都不安全,没有锁。
public E remove(int index) {}
//二是这哥们都是抄袭Vector 的代码,想气死 Vector (玩笑)
public boolean remove(Object o) {}
//Vector 已过时了,不考虑安全的不要用他,考虑安全的也不用他,他锁太多,效率低下。。
...................
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2