线程安全
在Java中,线程安全的集合主要分为两大类:同步集合(通过Collections.synchronizedXxx
包装)和并发集合(java.util.concurrent
包中的集合)。以下是常见的线程安全集合及其特点:
1. 同步集合(Synchronized Collections)
这些集合通过Collections.synchronizedXxx
方法包装,使得单个操作是线程安全的。但需要注意的是,这些集合在多线程环境下性能较差,因为它们会对整个集合加锁。
-
Vector
:-
线程安全的动态数组,类似于
ArrayList
,但方法被同步。 -
示例:
java复制
Vector<Integer> vector = new Vector<>(); vector.add(1); vector.add(2);
-
特点:线程安全,但性能较低。
-
-
Stack
:-
继承自
Vector
,实现了后进先出(LIFO)的栈结构。 -
示例:
java复制
Stack<Integer> stack = new Stack<>(); stack.push(1); stack.pop();
-
-
Hashtable
:-
线程安全的哈希表,类似于
HashMap
,但不允许键或值为null
。 -
示例:
java复制
Hashtable<String, Integer> hashtable = new Hashtable<>(); hashtable.put("key", 1);
-
-
Collections.synchronizedList
、Collections.synchronizedMap
、Collections.synchronizedSet
:-
可以将普通的集合包装成线程安全的集合。
-
示例:
java复制
List<String> list = Collections.synchronizedList(new ArrayList<>()); Map<String, Integer> map = Collections.synchronizedMap(new HashMap<>()); Set<String> set = Collections.synchronizedSet(new HashSet<>());
-
2. 并发集合(Concurrent Collections)
这些集合位于java.util.concurrent
包中,通过更细粒度的锁或无锁机制实现高性能的线程安全操作。
-
ConcurrentHashMap
:-
线程安全的哈希表,支持高并发的读写操作。
-
使用分段锁(Segment)或CAS操作实现高性能。
-
示例:
java复制
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>(); map.put("key", 1);
-
-
ConcurrentLinkedQueue
:-
线程安全的无界队列,基于链表实现。
-
使用CAS操作保证线程安全。
-
示例:
java复制
ConcurrentLinkedQueue<Integer> queue = new ConcurrentLinkedQueue<>(); queue.add(1); queue.poll();
-
-
BlockingQueue
接口及其实现类:-
线程安全的队列,支持阻塞操作。
-
常见实现类:
-
ArrayBlockingQueue
:基于数组的有界阻塞队列。 -
LinkedBlockingQueue
:基于链表的可选有界阻塞队列。 -
PriorityBlockingQueue
:支持优先级的无界阻塞队列。 -
DelayQueue
:支持延迟获取元素的无界阻塞队列。 -
SynchronousQueue
:不存储元素的阻塞队列,用于线程间直接传递数据。 -
LinkedTransferQueue
:支持传输操作的无界阻塞队列。
-
-
示例:
java复制
BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(); queue.put(1); // 可能阻塞 queue.take(); // 可能阻塞
-
-
CopyOnWriteArrayList
:-
线程安全的动态数组,写操作时会复制整个数组。
-
适用于读多写少的场景。
-
示例:
java复制
CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>(); list.add(1);
-
-
CopyOnWriteArraySet
:-
线程安全的集合,基于
CopyOnWriteArrayList
实现。 -
示例:
java复制
CopyOnWriteArraySet<Integer> set = new CopyOnWriteArraySet<>(); set.add(1);
-
-
ConcurrentSkipListMap
和ConcurrentSkipListSet
:-
分别是线程安全的有序映射和有序集合,基于跳表实现。
-
示例:
java复制
ConcurrentSkipListMap<String, Integer> map = new ConcurrentSkip
-