安全线程的集合

1. CopyOnWriteArrayList

java 复制代码
package com.kuang.unsafe;

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

//java.util.ConcurrentModificationException  并发修改异常! 因为List集合线程不安全!
public class ListTest {
    public static void main(String[] args) {
        //并发下 ArrayList 不安全的!
        /**
         * 解决方案:
         * 1. List<String> list = new Vector<>();  只是在add()方法加了一个synchronized 关键字 ,最早出现的,但不是最优解,效率太低了.
         * 2. Collections工具类转化为安全集合        List<String> list = Collections.synchronizedList(new ArrayList<>());
         * 3.第三种方案:JUC下的安全集合 new CopyOnWriteArrayList<>(); import java.util.concurrent.CopyOnWriteArrayList;
         *
         */
        //CopyOnWrite 写入时复制  COW 计算机程序设计领域的一种优化策略;
        //多个线程调用的时候,list,读取的时候,固定的,写入(覆盖);
        //在写入的时候避免覆盖,造成的数据问题
//         写入复制一个数组写入,写完在插进去
        //读写分离 MyCat

        //CopyOnWriteArrayList 比 Vector  牛在哪里?
        //没有用Synchronized 用的是 Lock锁  效率提高,

       List<String> list =new CopyOnWriteArrayList<>();

        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();
        }


    }
}

方法推荐1.先会用2.货比三家,寻找其他解决方案 3.看源码

CopyOnWriteArrayList 是 Java 中的一个线程安全的集合类,它的设计目的是在读操作非常频繁,而写操作相对较少的情况下提供高效的并发访问。

CopyOnWriteArrayList 使用写入时复制(Copy-On-Write)的机制来实现线程安全。当有写操作(例如添加、修改或删除元素)时,它会创建一个新的副本(即复制原有的数组),并在副本上执行写操作,而不是直接在原有数组上进行操作。这样可以保证读操作不会被阻塞,因为读操作始终在原有的数组上进行。

使用写入时复制的主要优点是避免了读写冲突,从而提供了较好的并发性能。在多线程环境下,多个线程可以同时读取 CopyOnWriteArrayList 的内容,而不需要进行额外的同步操作。这对于读操作非常频繁的场景非常有效。

然而,写操作会导致创建新的副本,因此会消耗额外的内存,并且对于频繁的写操作可能会影响性能。因此,CopyOnWriteArrayList 适用于读多写少的场景,例如读取频率远远高于写入频率的缓存或事件监听器列表。

总结来说,CopyOnWriteArrayList 使用写入时复制的机制,通过牺牲写操作的性能来提供读操作的高并发性能,适用于读多写少的场景。

2. CopyOnWriteArraySet

java 复制代码
package com.kuang.unsafe;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CopyOnWriteArraySet;
//java.util.ConcurrentModificationException 并发下出现这个问题  :并发修改异常

public class SetTest {
    public static void main(String[] args) {

        /**
         * 注意synchronizedSet在用迭代器循环时,另外一个线程试图修改数据,也会发生并发修改异常!!
         * HashSet<String> set = new HashSet<>();
         * 解决方案:
         * 1.    Set<String> set = Collections.synchronizedSet(new HashSet<String>());
         * 2.    Set<String> set = new CopyOnWriteArraySet<>();
         *
         */
       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);
            }).start();
        }



    }
}

2.1 HashSet 底层是什么?

java 复制代码
 public HashSet() {
        map = new HashMap<>();
    }

//add set 本质就是 map key 是无法重复的

java 复制代码
  public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }
java 复制代码
private static final Object PRESENT = new Object();

它是一个常量,是不变的值

3.ConcurrentHashMap

java 复制代码
package com.kuang.unsafe;

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

//java.util.ConcurrentModificationException
public class MapTest {
    public static void main(String[] args) {
        //map 是这样用的吗? 不是,工作里不用HashMap
        //默认等价于什么? new HashMap<>(16,0.75);
        /**
         * 解决方案:  Map<String, String> map = new HashMap<>();
         * 1.    Map<String, String> map = Collections.synchronizedMap(new HashMap<>());
         * 2.    Set<String> set = new CopyOnWriteArraySet<>();
         * 3.    Map<String, String> map = new ConcurrentHashMap<>();
         */

       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,5));
                System.out.println(map);
            },String.valueOf(i)).start();
        }
    }
}
复制代码
相关推荐
黑客老李25 分钟前
EDUSRC:智慧校园通用漏洞挖掘(涉校园解决方案商)
服务器·前端·网络·安全·web安全
玥轩_52133 分钟前
BUUCTF [WUSTCTF2020]spaceclub 1
安全·网络安全·ctf·buuctf·ascii·spaceclub·wustctf2020
weixin_472339461 小时前
网络安全之重放攻击:原理、危害与防御之道
安全·web安全
sam.li1 小时前
WebView安全实现(一)
android·安全·webview
weixin_472339461 小时前
网络安全之注入攻击:原理、危害与防御之道
安全·web安全
1024小神2 小时前
tauri项目在windows上的c盘没有权限写入文件
c语言·开发语言·windows
诗句藏于尽头9 小时前
完成ssl不安全警告
网络协议·安全·ssl
程序视点11 小时前
Window 10文件拷贝总是卡很久?快来试试这款小工具,榨干硬盘速度!
windows
wuk99811 小时前
基于MATLAB编制的锂离子电池伪二维模型
linux·windows·github
lzb_kkk12 小时前
【C++】C++四种类型转换操作符详解
开发语言·c++·windows·1024程序员节