java中有哪些线程安全的数据类型呢?
下文笔者讲述java中线程安全的数据类型简介说明,如下所示
达到一个屏障点后再继续执行 控制同时访问的线程数量(资源池、限流等) 两个线程之间交换数据的同步点
例
线程安全集合类(`java.util.concurrent`包)
类型 | 描述 |
`ConcurrentHashMap<K,V>` | 线程安全的哈希表, 适用于高并发场景 |
`CopyOnWriteArraylist<E>` | 写时复制的线程安全列表, 适合读多写少的场景 |
`CopyOnWriteArraySet<E>` | 基于 `CopyOnWriteArrayList` 实现的线程安全 Set |
`ConcurrentLinkedQueue<E>` | 非阻塞、 线程安全的链表队列 |
`ConcurrentLinkedDeque<E>` | 双端队列, 线程安全 |
`LinkedBlockingQueue<E>` | 基于链表实现的 可选有界阻塞队列 |
`ArrayBlockingQueue<E>` | 基于数组实现的 有界阻塞队列 |
`PriorityBlockingQueue<E>` | 支持优先级排序的无界阻塞队列 |
`SynchronousQueue<E>` | 不存储元素的阻塞队列, 每个插入操作必须等待取出操作 |
`DelayQueue<E extends Delayed>` | 元素只有在其延迟过期后 才能被取出的队列 |
原子变量类(`java.util.concurrent.atomic`包)
这些类基于 CAS(Compare and Swap)技术实现 保证单个变量原子操作
类型 | 描述 |
`AtomicInteger` | 线程安全的整型变量 |
`AtomicLong` | 线程安全的长整型变量 |
`AtomicBoolean` | 线程安全的布尔值 |
`AtomicReference<T>` | 线程安全的引用类型变量 |
`AtomicIntegerArray`, `AtomicLongArray` 等 | 线程安全的数组元素操作 |
同步工具类(`java.util.concurrent`)
以下工具类 常用于控制多个线程之间协作允许一个或多个线程等待其他线程完成操作 多个线程互相等待,
达到一个屏障点后再继续执行 控制同时访问的线程数量(资源池、限流等) 两个线程之间交换数据的同步点
类型 |
`CountDownLatch` |
`CyclicBarrier` |
`Semaphore` |
`Exchanger<V>` |
旧版线程安全类(不推荐新项目使用)
类型 | 描述 |
`Vector<E>` | 线程安全的动态数组(方法都加synchronized) |
`Hashtable<K,V>` | 线程安全的 Map(方法都加synchronized) |
`Collections.synchronizedList(List<T>)` | 将普通List转为线程安全版本 |
`Collections.synchronizedMap(Map<K,V>)` | 将普通Map转为线程安全版本 |
1.使用`ConcurrentHashMap` ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>(); map.put("a", 1); map.computeIfAbsent("b", k -> 2); 2.使用`CopyOnWriteArrayList` CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>(); list.add("item1"); list.forEach(System.out::println); 3.使用`AtomicInteger` AtomicInteger counter = new AtomicInteger(0); counter.incrementAndGet(); // 原子自增
线程适用场景
场景 | 推荐类型 |
高并发 Key-Value 操作 | `ConcurrentHashMap` |
读多写少的列表 | `CopyOnWriteArrayList` |
原子变量操作 | `AtomicInteger`, `AtomicReference` |
生产者-消费者模型 | `BlockingQueue`系列 |
多线程协作控制 | `CountDownLatch`, `CyclicBarrier`, `Semaphore` |
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。