zoukankan      html  css  js  c++  java
  • 多线程下集合类不安全简单分析

    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     }
  • 相关阅读:
    mysql数据库 及 常用 SQL语句
    移动前端—图片压缩上传实践
    使用Nodejs 的http-proxy 模块做代理服务器的尝试
    Ajax请求参数为文件类型
    <iframe>框架标签的使用
    vue2 核心概念
    关于Web前端密码加密是否有意义的总结
    原生js 与 jQuery对比
    word文档操作
    js (ECMAScript) 对数据处理的 方法、属性总结
  • 原文地址:https://www.cnblogs.com/ShallowPen/p/12401744.html
Copyright © 2011-2022 走看看