1.集合类不安全案例(ArrayLIst):
1.1、代码示例
public class ArrayListNotSafeDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
for (int i = 0; i < 30; i++) {
new Thread(() -> {
list.add(UUID.randomUUID().toString().substring(0, 8));
System.out.println(list);
}, String.valueOf(i)).start();
}
}
}
运行代码出现了 java.util.ConcurrentModificationException
1.2、解决办法
1.2.1、 new Vector<>();
1.2.2、 Collection.synchronizedList(new ArrayList());
1.2.3 、JUC下的 new CopyOnWriteArrayList()
CopyOnWriteArrayList:写时复制,主要是一种读写分离的思想
写时复制,CopyOnWrite容器即写时复制的容器,往一个容器中添加元素的时候,不直接往当前容器Object[]添加,而是先将Object[]进行copy,复制出一个新的容器object[] newElements,然后新的容器Object[] newElements里添加原始,添加元素完后,在将原容器的引用指向新的容器 setArray(newElements);这样做的好处是可以对copyOnWrite容器进行并发的读 ,而不需要加锁,因为当前容器不需要添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器,写操作会加锁,适合读多写少的场景,不适合实时性要求高的场景
就是写的时候,把ArrayList扩容一个出来,然后把值填写上去,在通知其他的线程,ArrayList的引用指向扩容后的
2.集合类不安全案例(HashSet):
是HashMap的put(e,present)的实现,present是恒定的Object常量
2.1、解决方案
new CopyOnWriteArraySet()
3.集合类不安全案例(HashMap):
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
for (int i = 0; i < 30; i++) {
new Thread(() -> {
map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0, 8));
System.out.println(map);
}, String.valueOf(i)).start();
}
}
3.2、解决方案
3.2.1.Collections.synchronizedMap(new HashMap<>());
3.2.2.new ConcurrentHashMap<>();