多线程笔记(十)集合 的线程安全

2022-05-25 11:00:46 浏览数 (1)

目录

  • 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();

5 总结

0 人点赞