集合类不安全问题

ArrayList不是线程安全类,在多线程同时写的情况下,会抛出java.util.ConcurrentModificationException异常

解决办法:

1.使用Vector(ArrayList所有方法加synchronized,太重)

2.使用Collections.synchronizedList()转换成线程安全类

3.使用java.concurrent.CopyOnWriteArrayList(推荐)

通过写时复制来实现读写分离,比如其add()方法,就是先复制一个新数组,长度为原数组长度+1,然后将新数组最后一个元素设为添加的元素

java 复制代码
package com.xd.thread;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;

public class ListNoSafeDemo {
    public static void main(String[] args) {
        mapDemo();

    }

    private static void mapDemo() {
//        Map<String,String> map = new HashMap<>();
        Map<String,String> map = new ConcurrentHashMap<>();
        for (int i = 1; i < 10; i++) {
            new Thread(()->{
                map.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring(0,6));
                System.out.println(Thread.currentThread().getName()+"\t"+map);
            },String.valueOf(i)).start();
        }
    }


    private static void setDemo() {
        //Set<String> set = new HashSet<>();
        Set<String> set = new CopyOnWriteArraySet<>();

        for (int i = 1; i < 10; i++) {
            new Thread(()->{
                set.add(UUID.randomUUID().toString().substring(0,6));
                System.out.println(Thread.currentThread().getName()+"\t"+set);
            },String.valueOf(i)).start();
        }
    }



    private static void listDemo() {
        //List<String> list = new ArrayList();
        List<String> list = new CopyOnWriteArrayList();
        for (int i = 0; i < 10; i++) {
            new Thread(()->{
                list.add(UUID.randomUUID().toString().substring(0,6));
                System.out.println(Thread.currentThread().getName() +"\t" + list);
            },String.valueOf(i)).start();
        }
    }

}
相关推荐
佛祖让我来巡山2 天前
深入理解Java内存模型:从诡异Bug到优雅解决
线程安全·synchronized·volatile·final·jmm
huangyuchi.19 天前
【Linux系统】线程安全与死锁问题
互斥锁·线程安全·linux系统·死锁·linux线程·linux锁·死锁条件
yics.1 个月前
多线程——单例模式
java·单例模式·多线程·线程安全
Brookty1 个月前
【JavaEE】线程安全-内存可见性、指令全排序
java·开发语言·后端·java-ee·线程安全·内存可见性·指令重排序
Ronin3052 个月前
【Linux系统】单例式线程池
linux·服务器·单例模式·线程池·线程安全·死锁
shylyly_2 个月前
Linux->多线程2
java·linux·多线程·线程安全·线程同步·线程互斥·可重入
Tina学编程2 个月前
线程P5 | 单例模式[线程安全版]~懒汉 + 饿汉
java·单例模式·线程安全
佛祖让我来巡山3 个月前
【ThreadLocal全面解析】原理、使用与内存泄漏深度剖析
线程安全·内存泄漏·threadlocal
佛祖让我来巡山4 个月前
【锁的本质】锁本身就是共享资源,那么锁如何保证线程安全?
线程安全··锁的本质·线程安全原理·锁的原理
小安同学iter5 个月前
JUC并发编程(二)Monitor/自旋/轻量级/锁膨胀/wait/notify/锁消除
jvm·线程安全·juc并发