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