Java如何保证集合的线程安全?

两种方法

  • java.util.Collections提供的同步方法
  • package java.util.concurrent包提供的并发集合

现在对两种方法的使用做个介绍

Collections提供的同步方法

直接看java.util.Collections的源码

public static <T> Collection<T> synchronizedCollection(Collection<T> c);

public static <T> List<T> synchronizedList(List<T> list);

public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m);

public static <T> Set<T> synchronizedSet(Set<T> s);

可以看出,对于非线程安全的集合,如ArrayList,使用public static List synchronizedList(List list);方法,便是一个线程安全的了。
但是,有个很大的缺点,就是性能问题,Collections对线程安全的保证,就是简简单单的通过关键字synchronized来满足。
所以,就有了Java并发包

JUC提供了哪些同步集合呢?

数组

java.util.concurrent.CopyOnWriteArrayList

链表

下面这几个算用链表实现的队列
java.util.concurrent.LinkedBlockingDeque
java.util.concurrent.LinkedBlockingQueue
java.util.concurrent.LinkedTransferQueue

栈和队列

java.util.concurrent.ConcurrentLinkedDeque
java.util.concurrent.ConcurrentLinkedQueue
java.util.concurrent.ArrayBlockingQueue

Map

java.util.concurrent.ConcurrentHashMap

Set

java.util.concurrent.CopyOnWriteArraySet

其他常用类

JUC包中还提供了其他的一些重要类,来保证线程同步的,如,

java.util.concurrent.CountDownLatch
java.util.concurrent.atomic.AtomicBoolean
java.util.concurrent.atomic.AtomicInteger
java.util.concurrent.atomic.AtomicLong

你可能感兴趣的:(Java如何保证集合的线程安全?)