ArrayListLinkedList,HashSet,HashMap等等,它们都是线程不安全的。因此在高并发的场景下不能使用。应该使用它们对应的并发版本
使用起来非常耗时public class TestCollection {public static void main(String[] args) {arryTocon arryTocon = new arryTocon();arryTocon.start();for (int i = 0; i < 100_0000 ; i++) {arryTocon.list.add(i);}System.out.println(Thread.currentThread().getName() + "list 元素的数量" + arryTocon.list.size());}
}
class arryTocon extends Thread{List list = new ArrayList<>();@Overridepublic void run() {for (int i = 0; i < 100_0000 ; i++) {list.add(i);}System.out.println(Thread.currentThread().getName() + "list 元素的数量" + list.size());}
}
运行结果很明显可与看到有线程安全问题
Thread-0list 元素的数量1647242
mainlist 元素的数量1926604
List list = new ArrayList<>();
CopyOnWriteArrayList 解决了线程安全问题
Thread-0list 元素的数量18384
mainlist 元素的数量20000
public class TestCollection {public static void main(String[] args) {arryTocon arryTocon = new arryTocon();arryTocon.start();for (int i = 0; i < 100_0000 ; i++) {arryTocon.list.add(i);}System.out.println(Thread.currentThread().getName() + "list 元素的数量" + arryTocon.list.size());}
}class arryTocon extends Thread{CopyOnWriteArraySet list = new CopyOnWriteArraySet();@Overridepublic void run() {for (int i = 0; i < 100_0000 ; i++) {list.add(i);}System.out.println(Thread.currentThread().getName() + "list 元素的数量" + list.size());}
}
mainlist 元素的数量1343415
Thread-0 list 元素的数量1343415
mainlist 元素的数量1000000
Thread-0 list 元素的数量1000000
public class TestCollection {public static void main(String[] args) {arryTocon arryTocon = new arryTocon();arryTocon.start();for (int i = 0; i < 1_0000 ; i++) {arryTocon.list.put(i,i);}System.out.println(Thread.currentThread().getName() + "list 元素的数量" + arryTocon.list.size());}
}
class arryTocon extends Thread{ConcurrentHashMap list = new ConcurrentHashMap();@Overridepublic void run() {for (int i = 0; i < 1_0000 ; i++) {list.put(i,i);}System.out.println(Thread.currentThread().getName() + "list 元素的数量" + list.size());}
}
mainlist 元素的数量1146060
Thread-0list 元素的数量1146060
mainlist 元素的数量10000
Thread-0list 元素的数量10000