JUC
2021-01-27 17:02:13 3 举报
AI智能生成
java.util.concurrent下的基础扩展
作者其他创作
大纲/内容
阻塞队列 BlockingQueue
【当队列满时,队列会阻塞插入元素的线程,直到队列不满】<br>【当队列空时,队列会阻塞获取元素的线程,直到队列元素不为空】
ArrayBlockingQueue
数组实现的阻塞队列,需要指定初始容量
采用ReentrantLock<br>
通过条件notEmpty/notfull的condition,来通知队列的添加和删除<br>
LinkedBlockingQueue
链表实现的阻塞队列,可以/不用指定容量大小
有takeLock/putLock两种锁,take和put采用的是不同的锁
有notEmpty/notFull两种条件
PriorityBlockingQueue
带优先级的阻塞队列,可以传入对应的比较函数
DelayQueue
使用优先级队列实现的无界阻塞队列
可以指定多久才能从队列中获取元素,只有延迟期满才能从队列中获取元素
SynchronousQueue
一个不存储元素的阻塞队列
接口 BlockingDeque
LinkedBlockingDeque
由链表组成的双向阻塞队列
并发容器
接口 ConcurrentMap<br>
ConcurrentHashMap
线程安全且高效的hashMap,多线程HashMap可能出现死循环<br>HashTable效率相对低下
采用分段锁技术,先将数据分段,再给每一段配置一把锁,访问其中一段的时候,其他段仍然可以访问
ConcurrentSkipListMap
并发下线程安全的跳跃表
CopyOnWriteArrayList<br>
就是对一块内存进行修改时,不直接在原有内存块中进行写操作,而是将内存拷贝一份,在新的内存中进行写操作,写完之后,再将原来指向的内存指针指到新的内存,原来的内存就可以被回收。transient volatile array<br>
获取元素的时候没有加锁,添加/删除元素的时候会上锁
CopyOnWriteArraySet<br>
也是采用的CopyOnWriteArrayList
工具类
CountDownLatch
计数器,主线程调用await()被阻塞,各自线程执行countDown(),计数器减为0后,主线程执行<br>
内部类Sync继承AQS<br>
await()
countDown()
CyclicBarrier
reset() 重置屏障,循环使用
await() 当前线程被阻塞
多个线程执行到某一个位置之后,再同时执行
内部使用ReentrantLock
Semaphore
信号量,同一个资源,同时最多被几个线程访问。
不同线程竞争的时候,存在公平FairSync和不公平NonFairSync<br>
acquire() 获取
release() 释放资源
基础原子类 atomic<br>
Atomic包装类<br>
对基础类型的原子操作
AtomicReference
对对象的原子操作
AtomicStampedReference
内部类Pair 封装对象和版本号stemp
解决CAS的ABA问题
Accumulator/Adder
高并发下更有效,更高的吞吐量,但是有着更高的空间复杂度
更多地用于收集统计数据,而不是细粒度的同步控制
锁 locks
AQS
AbstractQuenedSynchronizer抽象的队列式同步器
提供了模板给具体的实现使用
资源state
共享资源的状态数
等待同步的队列
节点Node
是链状结构,前驱节点,后继节点。
节点类型<br>【SHARED】共享型<br>【EXCLUSIVE】独占型
节点等待状态<br>【SIGNAL -1:唤醒后继节点】<br>【CONDITION -2 :当前线程等待某个条件】<br>【CANCELLED 1 :线程被取消】
条件condition
类似Object的wait()和notify()
await() 当条件不满足的时候就会加入到等待队列,LockSupport.park阻塞自己<br>
signal() 唤醒等待队列的首节点,LockSupport.unpark对应的线程<br>
Condition
AbstractQueuedSynchronizer.ConditionObject<br>
await()
signal()
LockSupport
线程工具类,都是静态方法,可以在任意位置唤醒和阻塞线程<br>
park() 阻塞线程<br>
unpark() 唤醒线程
接口 lock<br>
ReentrantLock
重入锁,提供了公平锁FairSync,不公平锁NonFairSync
lock()加锁;tryLock() 尝试枷锁;lockInterruptibly()加锁可能被打断;<br>
unlock() 释放锁
newCondition() 获取条件
接口 ReadWriteLock
ReentrantReadWriteLock<br>
读读共享,写读/读写/写写互斥,适用于读情况多的场景下
readLock() 读锁
writeLock() 写锁<br>
线程池 Executor
ExecutorService<br>
ScheduledThreadPoolExecutor
可以指定时间执行的调度线程池
ThreadPoolExecutor
corePoolSize 核心线程数
maximumPoolSize 池中最大线程数
workQueue 暂时保存任务的队列
RejectedExecutionHandler 线程池关闭或者饱和的时候,对任务的拒绝策略<br>
CallerRunsPolicy
AbortPolicy 抛一个异常
DiscardPolicy 没有做任何的处理
DiscardOldestPolicy 找到队列的头然后执行<br>
keepAliveTime 线程池中空闲线程等待工作的超时时间
ThreadFactory 线程池中线程的创建【线程的分组、名称、优先级、是否是守护线程】
Executors
newFixedThreadPool
可重用的固定线程数的线程池
newSingleThreadExecutor
使用单个worker的线程池
newCachedThreadPool
根据需要可以创建新线程的线程池
其他
Future
RunnableFuture
FutureTask
当一个线程需要等待另一个线程把某个任务执行完成后才能继续执行
ScheduledFuture
fork/join
fork 把一个大任务,拆成若干个子任务并行的执行
join 合并这些子任务的执行结果,得到大任务的执行结果
ForkJoinTask
RecursiveTask 有返回结果的任务<br>
RecursiveAction 没有返回结果的任务
工作窃取 work-stealing
自己队列的任务执行完,帮助别人队列执行任务。
ForkJoinPool
收藏
收藏
0 条评论
下一页