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

版权声明:技术总结来自互联网,书籍,以及工作积累。如果觉得我的总结有帮助,欢迎分享。 https://blog.csdn.net/qq1332479771/article/details/85708479

两种方法

  • 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 <T> List<T> synchronizedList(List<T> 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

猜你喜欢

转载自blog.csdn.net/qq1332479771/article/details/85708479