java并发编程复习
2021-04-17 01:09:25 1 举报
AI智能生成
java并发编程
作者其他创作
大纲/内容
基础
线程的创建
继承Thread类重新run方法
实现Runnable接口,run()方法
实现Callable接口,call()方法
线程中断
interrupt()
suspend()
resume()
stop()
等待/通知
join
ThreadLocal
线程持有ThreadLocalMap
子线程无法获取父线程的TheadLocal
内存泄漏问题
InheritableThreadLocal
等待超时
并发容器和工具
ConcurrentHashMap
JDK1.7
get不加锁
put加锁
JDK1.8
CurrentLinkedQueue
阻塞队列
ArrayBlockingQueue
LinkedBlockingQueue
PriorityBlockingQueue
DelayQueue
LinkedBlockingDeque
SynchronousQueue
Fork/Join
并发原子类
原子方式更新基本类型
AtomicBoolean
AtomicInteger
AtomicLong
原子更新数组
AtomicIntegerArray
AtomicLongArray
AtomicReferenceArray
原子更新引用类型
AtomicReference
AtomicReferenceFieldUpdate
AtomicStampedReference
原子更新字段
AtomicIntegerFieldUpdater
AtomicLongFieldUpdater
并发工具类型
CountDownLatch
1、主线程await时判断计数器state是否为0,不为0则加入AQS队列
2、调用countDown递减state,如果减到0则唤醒AQS队列中的线程
CyclicBarrier
1、使用lock加Condition实现
2、await()时加锁同步递减计数器,未减到0则加入Condition等待队列
3、如果计时器变为0则唤醒Condition等待队列中的所有线程
Semaphore
递增计数器,到达指定数量后加入AQS队列中
Exchanger
线程池
处理流程
1、核心线程池是否已满,未满则新增线程执行任务
2、核心线程池已满,任务队列未满则加入队列,等待线程消费
3、队列已满,线程数未到最大线程数则创建线程执行
4、已到达最大线程数,执行拒绝策略
线程池参数
corePoolSize
runnableTaskQueue
maximumPoolSize
ThreadFactory
RejectExecutionHandler
AbortPolicy
CallerRunsPolicy
DiscardOldestPolicy
DiscardPolicy
提交任务
threadPoolExecutor.execute
threadPoolExecutor.submit
关闭线程池
shutdown
shutdownNow
线程池数量
IO密集型
CPU密集型
synchronized原理
monitor指令
monitorenter
monitorexit
对象头
01
无锁
偏向锁
00
10
11
锁升级过程
偏向锁
轻量级锁
重量级锁
原子操作CAS
ABA问题
循环时间长开销大,消耗CPU
多变量的原子操作
java内存模型
happens-before
volatile原理
将当前处理器缓存行的数据写回到系统内存
这个写回内存的操作会使其他CPU里缓存了该内存地址的数据无效
防止指令重排序
final的重拍规则
禁止把final域的写重排序到构造函数之外
读对象的final域之前,一定先读包含这个final域的对象引用
双重检测的单例模式
java中的锁
AQS原理
同步队列
获取锁
释放锁
独占式锁
共享式锁
锁类型
重入锁
ReentrantLock
synchronized
公平锁
非公平锁
读写锁
读锁
写锁
锁降级
LockSupport
park
unpark
Condition
await
signal
signalAll
Executor框架
ThreadPoolExecutor
SingleThreadExecutor
LinkedBlockingQueue
FixedThreadExecutor
LinkedBlockingQueue
CachedThreadExecutor
SynchronousQueue
ScheduleThreadPoolExecutor
ScheduleThreadPoolExecutor
DelayQueue
time
sequenceNumber
period
take()
1、获取time最小任务,大于当前时间则等待time,加到Condition等待队列中
2、如果取出最小任务后PriorityQueue中还有元素则唤醒Condition中线程
offer()
如果添加的任务的time比当前PriorityQueue中的头元素还小则唤醒Condition中的线程
SingleThreadScheduleExecutor
Future
Runnable接口
Callable接口
FutureTask实现
1、FutureTask.get()方法会判断state是否为RAN状态,如果不是则加入AQS队列
2、FutureTask.run()执行完后会更新state为RAN,并设置result为Callable.call()返回值,然后唤醒AQS队列中线程
0 条评论
下一页