并发编程之 concurrent包概述

Queue

接口BlockingQueue:队列存储,有put,take操作,put操作在队列满时阻塞,take操作在队列空时阻塞
主要实现类:
ArrayBlockingQueue
DelayQueue
LinkedBlockingQueue
PriorityBlockingQueue
SynchronusQueue

ArrayBlockingQueue:基于数组实现的队列,需要制定初始化容量,初始化完成后不能更改,通过记录当前下标实现数据put 与take操作定位,无需移动数组数据。
DelayQueue:具有延迟的队列,put到队列的数据必须在时效满后才能获取出来,在头部的元素是延迟满后存放最长时间的元素。使用该队列需要继承Delayed接口,Delayed接口继承了Comparable接口,实现类必须实现compareTo方法与getDelay(TimeUnit)方法。该队列可以用来存放需要延迟执行的任务。
LickBlockingQueue:基于链表实现的队列,可以选择上限,如果没有选择上限的话以Integer.MAX_VALUE为上限。内部以FIFO存储元素,在头部的元素是放入时间最长的元素。
PriorityBlockingQueue:具有优先级的队列,存放的元素必须实现Comparable接口,存放的顺序位置取决于元素的Comparable接口实现。该队列获取的Iterator不能保证有序。
SynchronousQueue:同步队列,一次只能放入一个元素。如果队列已经有一个元素,插入元素的线程会被阻塞,如果队列为空,获取元素的线程将被阻塞。

BlockingDeque(阻塞双端队列):两端都能进行元素的存取。在线程既是生产者又是消费者时可以使用。BlockingDeque继承BlockQueue,如果直接调用put,take方法,BlockDeque功能与BlockingQueue相同,在尾部添加元素,在头部获取元素。
实现类有 LinkedBlockingDeque

ConcurrentMap

支持并发存取操作的Map

ConcurrentHashMap:采用分段锁,每个分段互不影响,分段内的操作是同步操作,通过valotile关键字消除读锁。分段数量初始化后不能更改,默认初始分段数为16,负载因子为0.75,每次扩容数量与HashMap相同为2倍,超过最大扩容值后不再进行扩容,执行size函数时先执行两边不加锁统计各个分段的元素总数,如果两次统计结果不一致对整个Map,全部分段加锁重新统计。

ConcurrentNavigableMap接口:并发导航映射,实现类为ConcurrentSkipListMap,基于跳表实现,支持返回指定范围内的元素。

闭锁 CountDownLatch

支持让一个或多个线程等待一系列操作完成后再进行。初始化一个数值,每次调用countDown数值减一,调用await()方法等待数值减为0.

栏栅CyclicBarrier

等待指定数量的线程都到了await()位置后再往下执行,支持一个所有线程到达栏栅后的一个动作。

交换机 Exchanger

两个线程进行交换数据的汇合点。

信号量:Semaphore

初始化一个数值,调用aquire()方法时减1,调用release()方法时加1,是一个计数器信号量。aquire()方法与release()方法都有可能被阻塞。可以创建一个公平的信号量。

线程池 执行服务 ExecutorService

执行器服务,实现类为ThreadPoolExecutor,参数有 coreSize,maxSize,keepAlive,TimeUnit,taskQueue,ThreadFactory.当任务数大于coreSizetaskQueue.size时启用maxSize创建新的线程执行任务,如果任务数仍然超过maxSizetaskQueue.size则调用拒绝策略处理。

定时执行服务 ScheduleExecutorService

可以指定延迟时间后执行某任务,可以指定按固定频率执行某个任务,可以指定按上一个任务执行完成后延迟指定时间执行一个任务。

ForkJoinPool

可以将任务分解成多个子任务,并且获取子任务的结果进行合并,充分利用多核cpu,默认线程数为机器核心数。ExecutorService无法保证父子任务的执行顺序。

锁 Lock 详见Lock篇章

Atomic系列

基于Unsafe Cas实现的无锁线程安全类,该cas方式存在ABA问题(A线程准备修改值,B线程改值后B线程或其它线程有修改回去,像是没修改过,实际已经修改过),如果不太关心过程,只关心结果的话无需关心ABA问题。如果非常关心ABA问题可以使用AtomicStampRefrerence避免ABA问题,AtomicStampRefrence采用版本号避免ABA问题(类似乐观锁)。AtoMarkableReference只记录于没有被修改过,也能解决ABA问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值