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