public class A {
public static void main(String[] args) {
List<Integer> l = new ArrayList<>(2147483647);
//Exception in thread "main" java.lang.*****~~OutOfMemoryError~~ ***:** Requested array size exceeds ~~***VM limit***~~
// at java.util.ArrayList.<init>(Unknown Source)
// at com.A.main(A.java:11)
}
}
package com;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
public class TestArrayList {
public static void main(String[] args) {
// TODO Auto-generated method stub
// for(int i=1;i<100;i++)
//System.out.println("\n已经打印"+i+"%");
List<Integer> list = new ArrayList<>();
//List<Integer> list =new CopyOnWriteArrayList<>();
Collections.addAll(list, 11,22,33,44,55,66,77,88,99);
System.out.println(list.size()); // 9
for(Iterator<Integer> car =list.iterator(); car.hasNext();)
{
Integer x= car.next() ;
if(x>30)
{
car.remove();
}
}
System.out.println(list); // [11, 22]
}
void f() {
List<Integer> list =new CopyOnWriteArrayList<>();
Collections.addAll(list, 11,22,33,44,55,66,77,88,99);
System.out.println(list.size()); // 9
for(Iterator<Integer> car =list.iterator(); car.hasNext();)
{
Integer x= car.next() ;
if(x>30)
{
car.remove();
}
}
System.out.println(list); // [11, 22]
}
/*Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.concurrent.CopyOnWriteArrayList$COWIterator.remove(Unknown Source)
at com.TestArrayList.main(TestArrayList.java:19)
JDK5中添加了新的concurrent包,其中包含了很多并发容器,这些容器针对多线程环境进行了优化,大大提高了容器类在并发环境下的执行效率。
CopyOnWriteArrayList类是一个线程安全的List接口的实现,在该类的内部进行元素的写操作时,底层的数组将被完整的复制,
这对于读操作远远多于写操作的应用非常适合。在CopyOnWriteArrayList上进行操作时,读操作不需要加锁,而写操作类实现中对其进行了加锁。
在CopyOnWriteArrayList上获得的Iterator是不能进行set和remove操作的,否则会抛出异常。* */
}
本文探讨了Java中内存溢出的问题,并通过示例展示了如何创建一个线程安全的列表CopyOnWriteArrayList。文章解释了其内部机制及在多线程环境下为何能够提高执行效率。
1201

被折叠的 条评论
为什么被折叠?



