
JUC-02_并发类汇总概述
Lock框架和Tools类
-
接口:Condition
把Object的监视器方法wait()、notify()、notifyAll()方法分解成截然不同的对象,让这些对象与Lock任意组合使用。
为每个对象提供多个等待set - wait-set,通过await() signal() 休眠/唤醒线程。
Lock替代了synchronized,Condition替代了Object的监视器方法的使用。
-
接口:Lock
其实现提供了比synchronized更广泛的锁定操作,允许更灵活的结构来加锁解锁,支持多个相关的Condition对象
-
接口:ReadWriteLock
读写锁,一个只读,一个写入,只要没有writer,read可以线程共享,读锁线程共享,写锁线程独占
-
抽象类:AbstractOwnableSynchronizer
抽象类,独占方式的同步器,提供创建相关锁和同步器的抽象,由子类维护
-
抽象类(long):AbstractQueuedLongSynchronizer
抽象类,Long类型版本的AbstractOwnerableSynchronizer,适用于创建64位状态的多级别锁和屏障同步器
-
核心抽象类(int):AbstractQueuedSynchronizer
AQS,抽象类,模板方法模式,阻塞队列同步器。提供基础框架,实现为FIFO先进先出等待队列的阻塞锁和相关同步器(信号量,事件等等)
依靠单个的原子int变量表示大多同步器(内部用atomicInteger维护)
getState | setState(int new State) | compareAndSetState(int expect,int update)
-
锁常用类:LockSupport
创建锁和同步类的基本线程阻塞原语
park() 和 unpark() 方法分别是阻塞线程和解锁线程,较之Thread.suspend() Thread.resume()不会出现可能发生的死锁问题
-
锁常用类:ReentrantLock
可重入的互斥锁,synchronized的平替,功能更强大更灵活。
-
锁常用类:ReentrantReadWriteLock
ReentrantLock的实现ReadWriteLock接口的版本,读写版本,包括一个读锁和一个写锁
-
锁常用类:StampedLock
票据锁,三种模式(读,写,乐观锁),一个stamp状态由版本和模式两部分。
加锁方法会返回票据,相应的锁状态来表示并控制访问,0表示没有写锁被授权访问。读锁上分为乐观锁和悲观锁。
-
解锁时需要加锁时返回的stamp值
-
可乐观读,lock.tryOptimisticRead() ,lock.validate(stamp)
-
-
工具常用类:CountDownLatch
同步辅助类,在其他线程执行操作完成前,让一个或多个线程等待倒计时。await计数归零时唤醒,coundown()计数-1
类似lol进入游戏加载,等待10个人都加载好后才能进入游戏,影响的是主线程
countdownlatch是一次性的
-
工具常用类:CyclicBarrier
同步辅助类,允许一组线程互相等待,直到达到某个公共屏障点。
在涉及一组固定大小的线程的程序中,这些线程必需一直等待,barrier在释放线程后可以重用,因此叫Cyclic
实例化时设置一个初始值,例如为n,调用barrier.await()达到n次后会唤醒所有的等待线程。计数+1
各自影响,不影响主线程,赛车游戏,先到终点的车手等待其他人到终点进行结算
可重用
-
工具常用类:Phaser
同步辅助类,可实现CountDownLatch和CyclicBarrier类似的功能,且支持对任务动态调整,支持分层(树)结构来减少锁竞争,提高吞吐量。
-
工具常用类:Semaphore
信号量,用来限制可同时访问资源的上限,acquire和release方法分别减信号量和加信号量
-
工具常用类:Exchanger
两个线程之间协作的工具类,用于线程之间的数据交换。通过exchange()方法交换数据,一个线程exchange()后会等待另一个线程exchange()执行
Collections并发集合
-
Queue:ArrayBlockingQueue
数组支持的有界阻塞队列,FIFO,新插入元素在队尾,取是从队头取。
-
Queue:LinkedBlockingQueue
基于双向链表的无界阻塞队列,FIFO,新插入元素在队尾,取是从队头取。吞吐量比上边的高,但是大多数并发性能低
-
Queue:LinkedBlockingDeque
基于双向链表的双端阻塞队列。FIFO,FILO 可以从队列的任意一头取元素
-
Queue:ConcurrentLinkedQueue
基于单向链表的,线程安全的无界阻塞队列(CAS),FIFO,不允许null值,多个线程共享一个Collection时可用。 基于单向链表的,线程安全的无界并发队列(CAS),FIFO,不允许null值,多个线程共享一个Collection时可用。
-
Queue:ConcurrentLinkedDeque
基于双向链表的,线程安全的无界阻塞 双端队列,FIFO,FILO
-
Queue:DelayQueue
延时无界阻塞队列,Lock机制实现并发访问,只允许放延期对象,队尾插入元素,队头先“到期”,若队列元素没有到期,无法获取到该元素
-
Queue:PriorityBlockingQueue
无界优先级阻塞队列,Lock机制实现并发访问,priorityQueue的线程安全版,不允许null值,依赖compareable排序
-
Queue:SynchronousQueue
没有容量的同步队列,通过CAS实现并发访问,支持FIFO和FILO
-
Queue:LinkedTransferQueue
单向链表实现的无界阻塞队列,通过CAS实现并发访问,FIFO
综合了ConcurrentLinkedQueue,SynchronousQueue(公平模式)和LinkedBlockingQueue的功能,同时提供更高效的实现
-
List:CopyOnWriteArrayList
ArrayList的写时复制版本,在add和set操作底层通过复制一份数组来保证线程安全性,开销很大,适合并发情况下读多写少的场景
-
Set:CopyOnWriteArraySet
内部维护一个CopyOnWriteArrayList,在add前调用AddIfAbsent遍历数组判断实现元素的不可重复。性能略低于前者
-
Set:ConcurrentSkipListSet
基于ConcurrentSkipListMap的可缩放并发NavigableSet实现,set的元素可以根据他们的顺序自然排序,也可以根据创建时提供的compareable方法来排序,取决于具体的构造方法
-
Map:ConcurrentHashMap
线程安全版本的HashMap,jdk1.7之前使用Lock和segment分段锁技术提高并发效率,1.8在元素操作时使用cas+synchronized保证并发安全
-
Map:ConcurrentSkipListMap
线程安全的有序的hash表(相当于线程安全的TreeMap),映射可以根据自然顺序进行排序,也可以根据创建时提供的compareable方法来排序。取决于具体的构造方法
Atomic原子类
其基本的特征就是在多线程环境下,多个线程同时执行这些类的实例包含的方法时,具有排他性,保证这些类型的原子性操作,执行其中的指令时不会被打断
jvm层面硬件指令保证原子操作
-
基础类型:AtomicBoolean,AtomicInteger,AtomicLong
-
数组:AtomicIntegerArray,AtomicLongArray,AtomicReferenceArray
-
引用:AtomicReference,AtomicMarkableReference,AtomicStampedReference
-
FieldUpdater:AtomicLongFieldUpdater,AtomicIntegerFieldUpdater,AtomicReferenceFieldUpdater
Executors线程池
-
接口:Executor
Executor接口提供各种对线程任务的提交和调度策略
-
ExecutorService
继承自Executor接口,提供管理和终止的方法,提供Future以追踪一个后多个异步任务的执行情况,关闭ExecutorService导致程序停止接受新任务
-
ScheduledExecutorService
继承自ExecutorService,可以延迟安排任务
-
AbstractExecutorService
继承自ExecutorService,提供默认的抽象实现(模板方法模式),newTaskFor返回的RunnableFuture实现submit,invokeAny和invokeAll方法。
默认情况下,RunnableFuture是它提供的FutureTask类
-
FutureTask
Future的基础实现,get()获取任务结果,cancel()取消任务等,任务未完成时,get方法会阻塞到
常用于封装Callable和Runnable,也可以作为一个任务提交到线程池中
基于CAS,提供额外的类供我们自定义task实现
-
核心:ThreadPoolExecutor
线程池,实现了AbstractExecutorService,也是一个ExecutorService,使用预设的线程池执行提交的任务,通常用Executors工厂方法创建
-
核心:ScheduledThreadPoolExecutor
带延迟执行功能的线程池
-
核心:Fork/Join框架
jdk7加入的一个线程池类,Fork/Join是分治算法的并行实现
提供更良好的并行性能和简单高效的设计技术
-
工具类:Executors
工具类,用来创建ExecutorService,ScheduleExecutorService,ThreadFactory,Callable,ThreadPoolExecutor,ScheduleThreadPoolExecutor,ForkJoinPool等对象