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不安全探究
- HashMap底层原理:通过key.hashCode() 方法计算Hash值,如果集合中没有这个Hash值,就将此元素就将其暂存。如果有相同Hash值,就用key.equals(key)再次进行比较,如果元素不同就存进去,如果元素相同就不存进去。HashMap 可以存放null=null
- 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 }