一文详解Java线程安全的集合有哪些

 更新时间:2025年06月02日 11:05:43   作者:+720  
在Java中线程安全的集合类对于多线程编程至关重要,它们能够确保在多个线程同时访问集合时数据的一致性和完整性,下面这篇文章主要介绍了Java线程安全集合有哪些的相关资料,需要的朋友可以参考下

Java 提供了多种线程安全的集合,它们位于 java.util.concurrent 包下,主要分为以下几类:

1. 阻塞队列 (BlockingQueue)

阻塞队列是一种特殊的队列,当队列为空时,获取元素的操作会被阻塞,直到队列中有元素可用;当队列已满时,添加元素的操作会被阻塞,直到队列中有空闲位置。

  • ArrayBlockingQueue: 基于数组的有界阻塞队列,按照 FIFO(先进先出)原则对元素进行排序。
  • LinkedBlockingQueue: 基于链表的可选有界阻塞队列(默认无界),按照 FIFO 原则对元素进行排序。
  • PriorityBlockingQueue: 无界阻塞队列,支持优先级排序。
  • SynchronousQueue: 同步队列,不存储元素,每个插入操作必须等待另一个线程的移除操作,反之亦然。
  • DelayQueue: 无界阻塞队列,只有在延迟期满时才能从中提取元素。
  • LinkedTransferQueue: 一个由链表结构组成的无界阻塞队列,它在SynchronousQueue的基础上添加了transfer方法。

代码示例 (ArrayBlockingQueue):

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class BlockingQueueExample {
    public static void main(String[] args) throws InterruptedException {
        BlockingQueue<String> queue = new ArrayBlockingQueue<>(10);

        // 生产者线程
        Thread producer = new Thread(() -> {
            try {
                for (int i = 0; i < 20; i++) {
                    queue.put("Item " + i); // 如果队列满了,会阻塞
                    System.out.println("Produced: Item " + i);
                    Thread.sleep(100);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        // 消费者线程
        Thread consumer = new Thread(() -> {
            try {
                for (int i = 0; i < 20; i++) {
                    String item = queue.take(); // 如果队列为空,会阻塞
                    System.out.println("Consumed: " + item);
                    Thread.sleep(200);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        producer.start();
        consumer.start();
    }
}

2. 并发 Map (ConcurrentMap)

ConcurrentMap 接口是 Map 接口的子接口,提供了线程安全的并发操作。

  • ConcurrentHashMap: 基于哈希表的线程安全 Map 实现,使用分段锁(JDK 1.7)或 CAS + synchronized (JDK 1.8+) 来实现并发控制。
  • ConcurrentSkipListMap: 基于跳表 (Skip List) 的线程安全 Map 实现,支持排序。

代码示例 (ConcurrentHashMap):

import java.util.concurrent.ConcurrentHashMap;

public class ConcurrentHashMapExample {
    public static void main(String[] args) {
        ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();

        // 多个线程并发地向 map 中添加元素
        Runnable task = () -> {
            for (int i = 0; i < 1000; i++) {
                map.putIfAbsent("Key" + i, i); // 原子操作
            }
        };

        Thread thread1 = new Thread(task);
        Thread thread2 = new Thread(task);

        thread1.start();
        thread2.start();
    }
}

3. 并发 Set (ConcurrentSet)

  • ConcurrentSkipListSet: 基于跳表的线程安全的Set,支持排序。
  • CopyOnWriteArraySet: 基于 CopyOnWriteArrayList 实现的线程安全 Set。

4. 并发 List (ConcurrentList)

  • CopyOnWriteArrayList: 线程安全的 List 实现,通过 写时复制 (Copy-On-Write) 的方式来实现并发控制。每次修改操作都会创建一个新的数组副本,读操作在原来的数组上进行,因此读操作不需要加锁,可以并发进行。适用于读多写少的场景。

代码示例 (CopyOnWriteArrayList):

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

public class CopyOnWriteArrayListExample {
    public static void main(String[] args) {
        List<String> list = new CopyOnWriteArrayList<>();

        // 读线程
        Runnable reader = () -> {
            for (String item : list) {
                System.out.println("Read: " + item);
            }
        };

        // 写线程
        Runnable writer = () -> {
            list.add("New Item");
            System.out.println("Added: New Item");
        };
    }
}

5. 其他

  • Collections.synchronizedXXX 方法: Collections 工具类提供了一些静态方法,可以将非线程安全的集合包装成线程安全的集合,例如:
    • Collections.synchronizedList(List<T> list)
    • Collections.synchronizedSet(Set<T> s)
    • Collections.synchronizedMap(Map<K,V> m)这些方法通过在每个方法上添加 synchronized 关键字来实现线程安全,性能较低。

总结:

Java 并发包提供了丰富的线程安全集合,可以满足不同的并发编程需求。选择合适的线程安全集合需要考虑以下因素:

  • 数据结构: 数组、链表、哈希表、跳表等。
  • 是否有界: 有界、无界。
  • 排序: 是否需要排序。
  • 读写比例: 读多写少、写多读少、读写均衡。
  • 性能要求: 对并发性能的要求。

问题分析:

这个问题考察了 Java 中线程安全集合的种类和用法。

与其他问题的知识点联系:

  • Java 线程安全的集合有哪些? 这是对 Java 并发集合的整体了解。
  • Java 中的 synchronized 是怎么实现的? Collections.synchronizedXXX 方法使用了 synchronized 关键字。
  • Java 中 ReentrantLock 的实现原理是什么? 一些并发集合(如 ArrayBlockingQueue)内部使用了 ReentrantLock
  • 什么是 Java 的 CAS(Compare-And-Swap)操作? 一些并发集合(如 ConcurrentHashMap)使用了 CAS 操作。
  • 你使用过 Java 中的哪些阻塞队列? 阻塞队列是线程安全集合的重要组成部分。

理解这些联系可以帮助你更全面地掌握 Java 并发编程的知识,并了解如何在实际应用中选择合适的线程安全集合。

到此这篇关于Java线程安全集合有哪些的文章就介绍到这了,更多相关Java线程安全的集合内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java多线程实现多人聊天室功能

    Java多线程实现多人聊天室功能

    这篇文章主要为大家详细介绍了Java多线程实现多人聊天室功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • java  ThreadPoolExecutor使用方法简单介绍

    java ThreadPoolExecutor使用方法简单介绍

    这篇文章主要介绍了java ThreadPoolExecutor使用方法简单介绍的相关资料,需要的朋友可以参考下
    2017-02-02
  • Springboot框架整合添加redis缓存功能

    Springboot框架整合添加redis缓存功能

    缓存就是一个存储器,在技术选型中,常用 Redis 作为缓存数据库。缓存主要是在获取资源方便性能优化的关键方面。Redis 是一个高性能的 key-value 数据库,接下来通过本文给大家介绍Springboot框架整合添加redis缓存功能,感兴趣的朋友一起看看吧
    2021-11-11
  • Spring Cloud Gateway 使用JWT工具类做用户登录校验功能

    Spring Cloud Gateway 使用JWT工具类做用户登录校验功能

    这篇文章主要介绍了Spring Cloud Gateway 使用JWT工具类做用户登录校验的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • java中创建、写入文件的5种方式

    java中创建、写入文件的5种方式

    这篇文章主要介绍了java中创建、写入文件的5种方式,帮助大家更好的理解学习Java io的相关知识,感兴趣的朋友可以了解下
    2020-08-08
  • Java 合并多个MP4视频文件

    Java 合并多个MP4视频文件

    这篇文章主要介绍了Java 合并多个MP4视频文件的方法,帮助大家利用Java处理视频,提高办公效率,感兴趣的朋友可以了解下
    2020-11-11
  • Java中JDom解析XML_动力节点Java学院整理

    Java中JDom解析XML_动力节点Java学院整理

    JDOM是一种解析XML的Java工具包。DOM适合于当今流行的各种语言,包括Java,JavaScripte,VB,VBScript,Perl,C,C++等。下面通过本文给大家介绍Java中JDom解析XML的方法,感兴趣的朋友一起学习吧
    2017-07-07
  • Mybatis CURD及模糊查询功能的实现

    Mybatis CURD及模糊查询功能的实现

    这篇文章主要介绍了Mybatis CURD及模糊查询功能的实现,有查询删除,插入,更新功能,通过实例代码讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-06-06
  • Javaweb开发中通过Servlet生成验证码图片

    Javaweb开发中通过Servlet生成验证码图片

    这篇文章主要为大家详细介绍了Javaweb开发中通过Servlet生成验证码图片的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • Java剑指offer之删除链表的节点

    Java剑指offer之删除链表的节点

    这篇文章主要介绍了Java剑指offer之删除链表的节点,给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点,下文更多相关内容介绍,需要的小伙伴可以参考一下
    2022-04-04

最新评论