并发编程
2019-11-11 13:54:17 3 举报
AI智能生成
并发编程复习图
作者其他创作
大纲/内容
内存模型的基础
线程封闭
静态变量
局部变量
ThreadLocal修饰
本地内存
主内存
重排序
编译器重排序
指令级并行重排序
内存系统的重排序
内存屏障类型
loadload barries
storeload barries
loadstore barries
StoreLoad Barriers
happen-before原则
Java并发机制的底层实现原理
volatile的原理
cpu术语
内存屏障
缓冲行
原子操作
写命中
写缺失
Lock前缀指令会引起处理器缓存回写到内存
一个处理器的缓存回写到内存会导致其他处理器的缓存无效
synchronized的实现原理
表现形式
原理
monitorenter
monitorexit
java对象头
锁的升级与对比
偏向锁
轻量级锁
重量级锁
原子操作的实现原理
处理器实现
使用总线锁保证原子性
使用缓存锁保证原子性
java实现
CAS实现
CAS三个问题
ABA问题
循环时间长开销大
每次只能修改一个变量
使用锁机制实现原子操作
java内存模型
内存模型的基础
线程封闭
静态变量
局部变量
ThreadLocal修饰
本地内存
主内存
重排序
编译器重排序
指令级并行重排序
内存系统的重排序
内存屏障类型
loadload barries
storeload barries
loadstore barries
StoreLoad Barriers
happen-before原则
重排序
数据依赖性
as-if-serial语义
顺序一致性模型
volatile内存语义
volatile的特性
内存语义
重排序规则
实现
锁的内存定义
锁的释放和获取的内存语义
lock指令前缀
公平锁与非公平锁
final域的内存定义
final域的重排序规则
写final域
读final域
final域为引用对象
happens-before
定义
规则
双重检查锁的初始化
并发容器和框架
ConcurrentHashMap实现原理
1.7
分段锁
get
put()
扩容
size()
1.8
非阻塞队列ConcurrentLinkedQueue
入队列
offer(E e)
定位尾结点
设置入队节点为尾结点
HOPS的设计意图
出队列
poll()
阻塞队列
java中的阻塞队列
ArrayBlockingQueue
LinkedBlockingQueue
PriorityBlockingQueue
DelayQueue
应用场景
缓存系统的设计
定时任务调度
实现
SynchronousQueue
LinkedTransferQueue
transfer方法
tryTransfer方法
LinkedBlockingDeque
阻塞队列的实现原理
fork/join框架
工作窃取
RecursiveAction
RecursiveTask
代码示例
Fork/Join框架的异常处理
实现原理
fork
join
线程池
使用线程池的好处
降低资源消耗
提高响应速度
提高线程的可管理性
new一个线程池所需参数
核心线程数量-corePoolSize
最大线程数量-maximumPoolSize
存活时间-keepAliveTime
时间单位-unit
ThreadFactory
工作队列-workQueue
拒绝策略-handler
CallerRunsPolicy
AbortPolicy
DiscardPolicy
DiscardOldestPolicy
提交任务
execute(Runnable)
Future<T> submit(Callable)
关闭线程池
shutdown()
shutdownNow()
13个原子类
原子更新基本数据类
AtomicBoolean
AtomicInteger
AtomicLong
原子更新数组类
AtomicIntegerArray
AtomicLongArray
AtomicReferenceArray
原子更新引用类型
AtomicReference
AtomicReferenceFieldUpdater 原子更新引用类型里面的字段
AtomicMarkableReference:原子更新带有标记位的引用类型
原子更新字段类
AtomicIntegerFieldUpdater:原子更新整型的字段的更新器
AtomicLongFieldUpdater:原子更新长整型字段的更新器
AtomicStampedReference:原子更新带有版本号的引用类型
并发编程的挑战
上下文切换
并行和并发的区别
减少上下文切换
无锁并发编程
cas算法
使用最少线程
协程
死锁
demo
避免死锁的方法
减少一个线程获取多个锁
避免一个锁占用多个资源
使用超时锁
对于数据库锁,加锁和解锁必须在一个数据库连接里
并发编程基础
线程的简介
使用多线程的好处
更多的cpu使用
更快的响应时间
更好的编程模型
线程优先级
线程状态
Daemon线程
启动和终止线程
启动线程
中断
过期的suspend()、resume()和stop()
安全终止线程
线程间的通信
volatile和synchronized关键字
等待/通知机制
notify()
notifyAll()
wait()
wait(long)
注意点
管道输入/输出流
thread.join()
ThreadLocal
java中的锁
Lock接口
独占锁 demo
队列同步器-AQS
volatile state
setState()
getState()
compareAndSetState(int expect,int update))
同步队列
独占式同步状态获取与释放
获取
释放
共享式同步状态获取与释放
获取
释放
独占式超时获取同步状态
代码
详解
ReentrantLock
可重入实现
获取
释放
公平与非公平锁
ReentrantReadWriteLock
读写状态的设计
写锁的获取与释放
获取
释放
读锁的获取与释放
获取
释放
getReadHoldCount()
锁降级
代码示例
LockSupport
park()方法何时返回?
Condition
代码示例
demo1
demo2-有界阻塞队列
Condition的实现
等待队列
等待
通知
Executor框架
框架简介
两级调度模型
框架结构
任务
Runnable
Callable
任务的执行
异步计算的结果
框架成员
Executors
创建ThreadPoolExecutor
newFixedThreadPool(nThreads)
newCachedThreadPool()
newSingleThreadExecutor()
创建ScheduledThreadPoolExecutor
newScheduledThreadPool(int)
newSingleThreadScheduledExecutor()
把一个Runnable包装成一个Callable的API
Callable<T> callable(Runnable task)
Callable<T> callable(Runnable task, T result)
Future
Runnable接口和Callable接口
ThreadPoolExecutor详解
FixedThreadPool
SingleThreadExecutor
CachedThreadPool
ScheduledThreadPoolExecutor详解
执行步骤
ScheduledFutureTask
DelayQueue
FutureTask详解
简介
未启动
已启动
已完成
cancel(boolean)
使用
demo
实现原理
1.7版本及以前
1.8版本
编码规定
阿里巴巴规约
并发工具类
CountDownLatch
countDown()
await()
await(long time,TimeUnit unit)
getCount()
栅栏-CyclicBarrier
new CyclicBarrier(int,RunnerAble)
await()
await(long ,TimeUnit)
使用场景-拼多多
信号量-Semaphore
使用场景
流量控制
Exchanger
并发编程实践
生产者消费者模式
线上问题定位
性能测试
异步任务池
任务隔离
重试策略
注意事项
任务属性
0 条评论
下一页