• 安全线程的集合


    1. CopyOnWriteArrayList

    1. package com.kuang.unsafe;
    2. import java.util.*;
    3. import java.util.concurrent.CopyOnWriteArrayList;
    4. //java.util.ConcurrentModificationException 并发修改异常! 因为List集合线程不安全!
    5. public class ListTest {
    6. public static void main(String[] args) {
    7. //并发下 ArrayList 不安全的!
    8. /**
    9. * 解决方案:
    10. * 1. List list = new Vector<>(); 只是在add()方法加了一个synchronized 关键字 ,最早出现的,但不是最优解,效率太低了.
    11. * 2. Collections工具类转化为安全集合 List list = Collections.synchronizedList(new ArrayList<>());
    12. * 3.第三种方案:JUC下的安全集合 new CopyOnWriteArrayList<>(); import java.util.concurrent.CopyOnWriteArrayList;
    13. *
    14. */
    15. //CopyOnWrite 写入时复制 COW 计算机程序设计领域的一种优化策略;
    16. //多个线程调用的时候,list,读取的时候,固定的,写入(覆盖);
    17. //在写入的时候避免覆盖,造成的数据问题
    18. // 写入复制一个数组写入,写完在插进去
    19. //读写分离 MyCat
    20. //CopyOnWriteArrayList 比 Vector 牛在哪里?
    21. //没有用Synchronized 用的是 Lock锁 效率提高,
    22. List list =new CopyOnWriteArrayList<>();
    23. for (int i = 0; i < 10; i++) {
    24. new Thread(()->{
    25. list.add(UUID.randomUUID().toString().substring(0,5));
    26. System.out.println(list);
    27. },String.valueOf(i)).start();
    28. }
    29. }
    30. }

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

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

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

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

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

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

    2. CopyOnWriteArraySet

    1. package com.kuang.unsafe;
    2. import java.util.Collections;
    3. import java.util.HashSet;
    4. import java.util.Set;
    5. import java.util.UUID;
    6. import java.util.concurrent.CopyOnWriteArraySet;
    7. //java.util.ConcurrentModificationException 并发下出现这个问题 :并发修改异常
    8. public class SetTest {
    9. public static void main(String[] args) {
    10. /**
    11. * 注意synchronizedSet在用迭代器循环时,另外一个线程试图修改数据,也会发生并发修改异常!!
    12. * HashSet set = new HashSet<>();
    13. * 解决方案:
    14. * 1. Set set = Collections.synchronizedSet(new HashSet());
    15. * 2. Set set = new CopyOnWriteArraySet<>();
    16. *
    17. */
    18. Set set = new CopyOnWriteArraySet<>();
    19. for (int i = 0; i < 30; i++) {
    20. new Thread(()->{
    21. set.add(UUID.randomUUID().toString().substring(0,5));
    22. System.out.println(set);
    23. }).start();
    24. }
    25. }
    26. }

    2.1 HashSet 底层是什么?

    1. public HashSet() {
    2. map = new HashMap<>();
    3. }

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

    1. public boolean add(E e) {
    2. return map.put(e, PRESENT)==null;
    3. }
    private static final Object PRESENT = new Object();

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

    3.ConcurrentHashMap

    1. package com.kuang.unsafe;
    2. import java.util.Collections;
    3. import java.util.HashMap;
    4. import java.util.Map;
    5. import java.util.UUID;
    6. import java.util.concurrent.ConcurrentHashMap;
    7. //java.util.ConcurrentModificationException
    8. public class MapTest {
    9. public static void main(String[] args) {
    10. //map 是这样用的吗? 不是,工作里不用HashMap
    11. //默认等价于什么? new HashMap<>(16,0.75);
    12. /**
    13. * 解决方案: Map map = new HashMap<>();
    14. * 1. Map map = Collections.synchronizedMap(new HashMap<>());
    15. * 2. Set set = new CopyOnWriteArraySet<>();
    16. * 3. Map map = new ConcurrentHashMap<>();
    17. */
    18. Map map = new ConcurrentHashMap<>();
    19. for (int i = 0; i < 30; i++) {
    20. new Thread(()->{
    21. map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0,5));
    22. System.out.println(map);
    23. },String.valueOf(i)).start();
    24. }
    25. }
    26. }
    
                    
  • 相关阅读:
    (二)centos7案例实战——Nexus3伺服仓库服务器搭建
    【pygame游戏】用Python实现一个蔡徐坤大战篮球的小游戏,可还行?【附源码】
    GPT-4 Turbo:OpenAI发布旗舰版GPT-4模型,更便宜|更强大|128K上下文|支持多模态
    1.5 字符串基本操作(Python)
    java装饰器设计模式
    4种小众的能力,帮你更好地适应未来
    Python正则表达式
    java实现发送接收邮件的功能(详细代码步骤和jar包)
    【Linux】云服务器的购买与Linux远程连接
    一个有意思的数学结论
  • 原文地址:https://blog.csdn.net/qq_53374893/article/details/132921530