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


    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     }
  • 相关阅读:
    EXTJS4.2——0.简介
    什么是JDBC?
    Applet和普通的Java应用程序有什么区别?
    final关键字、finally代码块和finalize()方法有什么区别?
    throw和throws有什么区别
    Java中的两种异常类型是什么?他们有什么区别?
    Java堆的结构是什么样子的?什么是堆中的永久代(Perm Gen space)?
    flash插件
    算法复杂度分析中的符号(大Θ符号、大Ο符号...)
    Enumeration接口和Iterator接口的区别有哪些?
  • 原文地址:https://www.cnblogs.com/ShallowPen/p/12401744.html
Copyright © 2020-2023  润新知