多线程下集合类不安全简单分析

1. List不安全探究

 1     // ArrayList<String> list = new ArrayList<>(); // ArrayList 源码中CRUD没加synchronized同步
 2     // List<String> list = new Vector<>();      // Vector 源码中CRUD加了synchronized同步,但效率没有ArrayList高
 3     // List<String> list = Collections.synchronizedList(new ArrayList<>());  // 使用Collections工具类将ArrayList转化为安全类
 4     List<String> list = new CopyOnWriteArrayList<>(); // JUC下的安全类,推荐在多线程下使用
 5     
 6     for (int i = 0; i < 30; i++) {
 7         new Thread(() -> {
 8             list.add(UUID.randomUUID().toString().substring(0,1));
 9             System.out.println(list);
10         },String.valueOf(i)).start();
11     }

2.Set不安全探究

 1     // HashSet<Object> set = new HashSet<>(); // HashSet源码中是new 了一个HashMap 实例,底层实际是HashMap
 2     // Set<Object> set = Collections.synchronizedSet(new HashSet<>()); // 使用Collections 工具类将HashSet转化为安全类
 3     Set<Object> set = new CopyOnWriteArraySet<>(); // JUC下的安全类,推荐在多线程下使用,CRUD操作中加了Lock锁
 4 
 5     for (int i = 0; i < 300; i++) {
 6         new Thread(() -> {
 7             set.add(UUID.randomUUID().toString().substring(0,2));
 8             System.out.println(set);
 9         },String.valueOf(i)).start();
10     }

3. Map不安全探究

  1. HashMap底层原理:通过key.hashCode() 方法计算Hash值,如果集合中没有这个Hash值,就将此元素就将其暂存。如果有相同Hash值,就用key.equals(key)再次进行比较,如果元素不同就存进去,如果元素相同就不存进去。HashMap 可以存放null=null
  2. HashTable底层原理:和HashMap相似,不过其CRUD操作加了synchronized 同步,其不可以存放null=null

  细节:在开发中建议根据实际给出初始容量,不然容量扩容会降低效率,默认初始容量为16,加载因子为0.75F

 1     // HashMap<String,String> map = new HashMap<>(20); // 源码中CRUD没加synchronized同步,在开发中根据实际给出初始同容量
 2     // Map<String,String> map = new Hashtable<>();    // CRUD加了synchronized同步
 3     Map<String,String> map = new ConcurrentHashMap<>(); // JUC下的并发安全类,推荐在多线程下使用
 4 
 5     for (int i = 0; i < 30; i++) {
 6         new Thread(() -> {
 7             map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0,2));
 8             System.out.println(map);
 9         },String.valueOf(i)).start();
10     }

猜你喜欢

转载自www.cnblogs.com/ShallowPen/p/12401744.html