列表接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括空在内的所有元素。除了实现列表接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于向量类,除了此类是不同步的)大小,isEmpty,得到集,迭代器和listIterator操作都以固定时间运行阀门操作以分摊的固定时间运行,也就是说,添加n个元素需要O (n)时间。其他所有操作都以线性时间运行(大体上讲)。与用于LinkedList实现的常数因子相比,此实现的常数因子较低。每个ArrayList实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向ArrayList中不断添加元素,其容量也自动增长。并未指定增长策略的细节,因为这不只是添加元素会带来分摊固定时间开销那样简单。在添加大量元素前,应用程序可以使用ensureCapacity操作来增加ArrayList实例的容量。这可以减少递增式再分配的数量。
注意,此实现不是同步的。
如果多个线程同时访问一个ArrayList实例,而其中至少一个线程从结构上修改了列表,那么它必须保持外部同步。(结构上的修改是指任何添加或删除一个或多个元素的操作,或者显式调整底层数组的大小,仅仅设置元素的值不是结构上的修改。)这一般通过对自然封装该列表的对象进行同步操作来完成。如果不存在这样的对象,则应该使用Collections.synchronizedList方法将该列表“包”装起来。这最好在创建时完成,以防止意外对列表进行不同步的访问:
Listlist=Collections.synchronizedList (newArrayList (…));
此类的迭代器和listIterator方法返回的迭代器是快速失败的:在创建迭代器之后,除非通过迭代器自身的删除或添加方法从结构上对列表进行修改,否则在任何时间以任何方式对列表进行修改,迭代器都会抛出ConcurrentModificationException。因此,面对并发的修改,迭代器很快就会完全失败,而不是冒着在将来某个不确定时间发生任意不确定行为的风险。
注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败迭代器会尽最大努力抛出ConcurrentModificationException。因此,为提高这类迭代器的正确性而编写一个依赖于此异常的程序是错误的做法:迭代器的快速失败行为应该仅用于检测错误。
如上所示,现在建立一个列表集合,一个线程对集合进行写入操作,一个线程进行删除操作
进口java.util.ArrayList; 进口java.util.Collections; 进口java.util.Iterator; 进口并不知道; 进口java.util.Random; 公开课MyArrayList {/* * *创建一个列的表,一个线程进行写入,一个线程读取迭代器和listIterator方法返回的迭代器是快速失败的 */公共空间读写(){ Listnum=new ArrayList (); List synNums=Collections.synchronizedList (num);//启动写入线程 新WriteListThread (synNums) .start ();//启动删除线程 新DeleteListThread (synNums) .start (); } 公共静态void main (String [] args) { 新的MyArrayList () .readWrite (); } } 类WriteListThread扩展线程{ 私人List num; 公共WriteListThread (List num) { 超级(“WriteListThread”); 这一点。num=num; }//不停写入元素1 公共空间run () { 而(真){ 全国矿工工会。(新添加随机().nextint (1000); System.out.println (Thread.currentThread () . getname ()); } } } 类DeleteListThread扩展线程{ 私人List num; 公共DeleteListThread (List num) { 超级(“DeleteListThread”); 这一点。num=num; }//删除第一个元素 公共空间run () { 而(真){ 尝试{ System.out.println (Thread.currentThread () . getname () +“:”+ nums.remove (0)); } 捕获(异常e) { 继续; } } } }
通过List 查看Collections.synchronizedList的源代码
名单列表=集合。synchronizedList(新ArrayList ());
同步(列表){
迭代器i=list.iterator ();//必须在同步块
而(i.hasNext ())
foo (i.next ());
}
SynchronizedCollection (Collection
java集合框架线程同步代码详解