他是线程不安全的,我们创建这个对象,调用他的add方法往里面加东西,我们看源码,可以看到这个add方法是没有加锁的,所以在多线程往这个集合里面加数据的时候,会出现并发修改异常
就是我们一边线程往list里面加东西,一边取东西,A线程在往list里面放东西,B线程从list里面拿东西,都是同一时间,所以会出现并发问题
//创建ArrayList集合
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();
}
以上代码会出现并发问题
因为这个类里面的方法上面都有synchronized关键字
java的jdk里面有一个工具类,collections ,这个类里面的方法有很多,都是静态方法
我们使用这个里面的一个方法创建线程安全的list的集合对象
// collections工具类
List<String> list = Collections.synchronizedList(new ArrayList<>());
多线程笔记(七)JUC 这个包下有很多的类,其中CopyOnWriteArrayList是一个安全的集合类
里面的add方法没有加锁,所以在多个线程对他进行加数据,读数据的时候,就会有线程安全的问题
CopyOnWriteArraySet list = new CopyOnWriteArraySet();
里面的put方法没有加锁,所以在多个线程对他进行加数据,读数据的时候,就会有线程安全的问题
ConcurrentHashMap oMap = new ConcurrentHashMap();