ArrayList 的 s&a
snowind9
2007-11-20
“注意,此实现不是同步的。如果多个线程同时访问一个 ArrayList 实例,而其中至少一个线程从结构上修改了列表,那么它必须 保持外部同步。(结构上的修改是指任何添加或删除一个或多个元素的操作,或者显式调整底层数组的大小;仅仅设置元素的值不是结构上的修改。)这一般通过对自然封装该列表的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedList 方法将该列表“包装”起来。这最好在创建时完成,以防止意外对列表进行不同步的访问:
List list = Collections.synchronizedList(new ArrayList(...)); 此类的 iterator 和 listIterator 方法返回的迭代器是快速失败的:在创建迭代器之后,除非通过迭代器自身的 remove 或 add 方法从结构上对列表进行修改,否则在任何时间以任何方式对列表进行修改,迭代器都会抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就会完全失败,而不是冒着在将来某个不确定时间发生任意不确定行为的风险。 注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败迭代器会尽最大努力抛出 ConcurrentModificationException。因此,为提高这类迭代器的正确性而编写一个依赖于此异常的程序是错误的做法:迭代器的快速失败行为应该仅用于检测 bug。” 这是javadoc得一段话。写在ArrayList的上边。没看明白于是测试如下 package spring; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Vector; public class ArrayListTest { //非同步的Arraylist public static List<String> list = new ArrayList<String>(); //同步的Arraylist //public static List<String> list = Collections.synchronizedList(new ArrayList<String>()); //Vector(同步) //public static List<String> list = new Vector<String>(); static { for (int i = 0; i < 5; i++) { list.add("" + i); } } public static void main(String[] args) { new Thread() { public void run() { synchronized (list) { // 非同步时,迭代器快速失败 for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) { String name = (String) iterator.next(); System.out.println(name); } // for (int j = 0; j < list.size(); j++) { // System.out.println(list.get(j)); // } } } }.start(); new Thread() { public void run() { list.remove(list.size() - 1); } }.start(); } } 分别用了非同步的arraylist 和 同步的arraylist 还有Vector进行程序的测试。结果很明显。而用枚举器和不用枚举器在非同步的情况下也是很明显的。(使用时。会产生ConcurrentModificationException),于是对上边的一段话了解了8 9成。 |
|
snowind9
2007-11-20
同理用于HashMap和HashTable
|
|
leon_a
2007-11-21
只能说这个中文翻译实在好差
|
|
snowind9
2007-12-17
我看英文原版的了。写的跟中文翻译的差不多。jdk写的就是概要。得仔细研究。泛泛的看看不懂。
|