java线程安全集合操作

2022-12-14  本文已影响0人  arkliu

CopyOnWriteArrayList

// 并发下ArrayList是不安全的
List<String> lst = new ArrayList<>();
// java.util.ConcurrentModificationException  并发修改异常
for (int i = 1; i <= 10; i++) {
    new Thread(()->{
        lst.add(UUID.randomUUID().toString().substring(0,5));
        System.out.println(lst);
    }, String.valueOf(i)).start();
}

解决方案:

1.  使用vector, vector是线程安全的
List<String> lst = new Vector();

2. 使用Collections.synchronizedList
List<String> lst = Collections.synchronizedList(new ArrayList<>());

3. 使用CopyOnWriteArrayList  写入时复制
List<String> lst = new CopyOnWriteArrayList<>();

CopyOnWriteArraySet

Set<String> set = new HashSet<>();
// java.util.ConcurrentModificationException  并发修改异常
for (int i = 1; i <= 10; i++) {
    new Thread(()->{
        set.add(UUID.randomUUID().toString().substring(0,5));
        System.out.println(set);
    }, String.valueOf(i)).start();
}

解决方案:

1. 使用Collections.synchronizedSet
Set<String> set = Collections.synchronizedSet(new HashSet<>());

2. 使用CopyOnWriteArraySet
Set<String> set = new CopyOnWriteArraySet<>();

ConcurrentHashMap

Map<String, String>map = new HashMap<>();
// java.util.ConcurrentModificationException  并发修改异常
for (int i = 1; i <= 20; i++) {
    new Thread(()->{
        map.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring(0,5));
        System.out.println(map);
    }, String.valueOf(i)).start();
}

解决方案:

1.. 使用ConcurrentHashMap
Map<String, String>map = new ConcurrentHashMap();
上一篇 下一篇

猜你喜欢

热点阅读