并发下的集合不安全--list\set\map

并发下的list不安全--- CopyOnWriteArrayList/Vector

*List list = new ArrayList<>(); ---->ConcurrentModificationException 并发修改异常
*方案1:List list = new Vector<>();
*方案2:List list = Collections.synchronizedList(new ArrayList<>());
*方案3:List list = new CopyOnWriteArrayList<>();

CopyOnWriteArrayList 比 vector 好在哪里?

Vector 的曾删改查方法都加上了synchronized锁,保证同步的情况下,因为每个方法都要去获得锁,所以性能就会大大下降。
CopyOnWriteArrayList 方法只是在增删改方法上增加了ReentrantLock锁,但是他的读方法不加锁,所以在读的方面就要比Vector性能要好,
CopyOnWriteArrayList适合读多写少的并发情况,读写分离,在写的时候复制出一个新的数组,完成插入、修改、删除操作,在完成操作后,将这个新的数组赋值给一个array。

并发下的集合不安全--list

package unsafe;

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

/**
 * CopyOnWriteArrayList---Vector
 * ConcurrentModificationException 并发修改异常
 *
 * @author liu
 */
public class ListTest {
    public static void main(String[] args) {
        //并发下,arraylist不安全的
        /*解决方案
         *List<String> list = new ArrayList<>(); ---->ConcurrentModificationException 并发修改异常
         *方案1:List<String> list = new Vector<>();
         *方案2:List<String> list = Collections.synchronizedList(new ArrayList<>());
         *方案3:List<String> list = new CopyOnWriteArrayList<>();
         */
        //CopyOnWrite 写入时复制 cow 计算机的程序设计领域的一种优化策略
        //多个线程调用的时候,list,读取的时候固定的,写入覆盖
        //在写入的时候避免覆盖,改造成数据问题!
        //CopyOnWriteArrayList 比 vector 好在哪里?
        //Vector 的曾删改查方法都加上了synchronized锁,保证同步的情况下,因为每个方法都要去获得锁,所以性能就会大大下降。
        //CopyOnWriteArrayList 方法只是在增删改方法上增加了ReentrantLock锁,但是他的读方法不加锁,所以在读的方面就要比Vector性能要好,
        //CopyOnWriteArrayList适合读多写少的并发情况,读写分离,在写的时候复制出一个新的数组,完成插入、修改、删除操作,在完成操作后,将这个新的数组赋值给一个array。
        List<String> list = new CopyOnWriteArrayList<>();
        for (int i = 1; i <= 10; i++) {
            new Thread(() -> {
                list.add(UUID.randomUUID().toString().substring(0, 1));
                System.out.println(list);
            }, String.valueOf(i)).start();
        }
        ;
    }
}

并发下的集合不安全--set

package unsafe;

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


/**
 * ConcurrentModificationException 并发修改异常
 *
 * @author liu
 */
public class SetTest {
    public static void main(String[] args) throws InterruptedException {
        //方案1:   Set<String> set = Collections.synchronizedSet(new HashSet<>());
        //方案2:   Set<String> Set = new CopyOnWriteArraySet<>();
        Set<String> set = new CopyOnWriteArraySet<>();

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

并发下的集合不安全--map

package unsafe;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;

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= Collections.synchronizedMap(new HashMap<>());
        //方案二:
        Map<String, String> map =new ConcurrentHashMap<>();
        for (int i = 0; i < 30; i++) {
            new Thread(() -> {
                map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0, 4));
                System.out.println(map);
            },String.valueOf(i)).start();
        }
    }
}

posted @   小幼虫虫  阅读(47)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示