本文主要整理JDK1.8并发包下面的类提供哪些功能及相关原理。Demo实现演示
一、线程安全容器类
1、ConcurrentHashMap
实现原理:synchronized加锁
一个线程安全的容器,设计对标HashMap。和HashMap的区别是在putVal、replaceNode、clear等方法加入synchronized关键词。
**使用场景:**提供线程安全的HashMap
2、ConcurrentSkipListMap
**实现原理:**跳表实现List线程不安全,性能算法在O(1)-logN之间。
**使用场景:**跳表适合有list场景需求,但是对性能要求比较高的场景。
3、ConcurrentSkipListSet
**实现原理:**跳表实现Set线程不安全,性能算法在O(1)-logN之间。
**使用场景:**跳表适合有Set场景需求,但是对性能要求比较高的场景。
4、CopyOnWriteArrayList
**实现原理:**ReentrantLock Cas乐观锁
一个数组线程安全操作类,原理是对数组先copy在操作,不同线程有不同的副本。在copy副本的时候使用ReentrantLock加锁保证副本的正确。在remove、add等方法加入ReentrantLock皆在于保证数据一致性。
**使用场景:**多线程数据线程环境,要求操作数据线程安全的场景
5、CopyOnWriteArraySet
**实现原理:**ReentrantLock Cas乐观锁
一个数组线程安全操作类,原理是对数组先copy在操作,不同线程有不同的副本。在copy副本的时候使用ReentrantLock加锁保证副本的正确。在remove、add等方法加入ReentrantLock皆在于保证数据一致性。
**实现场景:**多线程场景要求set集合线程安全的场景
二、线程安全队列
1、ConcurrentLinkedDeque
2、ConcurrentLinkedQueue
3、LinkedBlockingDeque
4、LinkedBlockingQueue
5、LinkedTransferQueue
6、PriorityBlockingQueue
7、SynchronousQueue
三、信号线程
1、CountDownLatch
**实现功能:**主线程等待声明的子线程数量执行完毕后在执行
**实现原理:**其实现原理很简单利用AQS申请3个共享节点每次线程countDown节点减一。当队列遍历完毕后开始释放共享线程队列。
**实现场景:**1、实现JVM钩子线程,等待任务处理完毕后处理应用关闭资源回收
2、任务并发处理,两个线程分表处理两类任务,处理完毕后统一执行主线程做接下来的逻辑。
2、CyclicBarrier
**实现功能:**所有声明的子线程等待就绪后一起并发执行。
**实现原理:其实现也比较简单,**dowait是其实现主要的逻辑。利用ReentrantLock加锁保证执行顺序,当线程准备完毕后自动执行run方法。
**实现场景:**少见,一般我自己用CountDownLatch。
3、Semaphore
**实现功能:**控制声明的子线程并发数量执行,比如一个方法只容许3个线程调用,100个线程一起调用,此时就阻塞等待执行。
**实现原理:**支持公平锁、非公平锁,每次线程执行的时候nonfairTryAcquireShared方法计数器
**实现场景:**1、线程池、连接池等场景,谁获取资源谁执行 待编辑
三、并行计算
1、CountedCompleter
2、ExecutorCompletionService
3、ForkJoinPool
4、ForkJoinTask
5、ForkJoinWorkerThread
6、RecursiveAction
7、RecursiveTask
四、线程池
1、ScheduledExecutorService
2、ScheduledThreadPoolExecutor
3、ThreadPoolExecutor
五、原子类
1、AtomicBoolean、AtomicInteger、AtomicLong…
2、AtomicReference
六、其他实现
1、ThreadLocalRandom 随机数