多线程下集合类不安全

多线程下集合类不安全

List 不安全

// java.util.ConcurrentModificationException 并发修改异常!
public class listTest {
    
    
    public static void main(String[] args) {
    
    
        //List<String> list = new ArrayList<>();
        //List<String> list = new Vector<>();
        List<String> list = new CopyOnWriteArrayList<>();


        // 并发下 ArrayList 不安全
        /*
        *   解决方案:
        *   1、List<String> list = new Vector<>();
        *   2、List<String> list = Collections.synchronizedList(new ArrayList<>());
        *   3、List<String> list = new CopyOnWriteArrayList<>();
        * */

//        Copyonwrite 写入时复制   COW  计算机程序设计领域的一种优化策略;
//        多个线程调用的时候,list,读取的时候,固定的,写入〔覆盖〕
//        在写入的时候避免覆盖,造成数据问题!
//        读写分离
        for (int i = 0; i < 10; i++) {
    
    
            new Thread(()->{
    
    
                list.add(UUID.randomUUID().toString().substring(0,5));
                System.out.println(list);
            }, String.valueOf(i)).start();
        }
    }
}

解决方案代码 关于CopyOnWriteArrayList的add方法
在这里插入图片描述

Set

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CopyOnWriteArraySet;

/*
*   同理可证: java.util.ConcurrentModificationException
*   1、Set<String> set = Collections.synchronizedSet(new HashSet<>());
*   2、
* */

public class SetTest {
    
    
    public static void main(String[] args) {
    
    
        Set<String> set = new HashSet<>();
        // Set<String> set = Collections.synchronizedSet(new HashSet<>());
        // Set<String> set = new CopyOnWriteArraySet<>();

        for (int i = 0; i <= 30; i++) {
    
    
            new Thread(()->{
    
    
                set.add(UUID.randomUUID().toString().substring(0,5));
                System.out.println(set);
            },String.valueOf(i)).start();
        }
    }
}

hashSet底层是什么?

public HashSet() {
    
    
    map = new HashMap<>();
}

// add set 本质就是 map key是无法重复的!
public boolean add(E e) {
    
    
    return map.put(e, PRESENT)==null;
}

private static final Object PRESENT = new Object();

Map 不安全

多线程的情况下,HashMap 不安全,现实工作里面非常常用,好多人都直接用HashMap代替JSON的。

回顾Map基本操作
在这里插入图片描述

// ConcurrentModificationException
public class MapTest {
    
    
    public static void main(String[] args) {
    
    
        // map 是这样用的吗? 不是,工作中不用 HashMap
        // 默认等价于什么?	new HashMap<>(16,0.75);
        // Map<String, String> map = new HashMap<>();
        //  唯一的一个家庭作业:研究ConcurrentHashMap的原理
        Map<String, String> map = new ConcurrentHashMap<>();

        for (int i = 1; i <=30; i++) {
    
     
            new Thread(()->{
    
    
                map.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring( 0,5));
                System.out.println(map);
            },String.valueOf(i)).start();
        }
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43803285/article/details/115374510