高效并发
2020-06-10 10:56:34 2 举报
AI智能生成
整理JVM高效并发相关知识
作者其他创作
大纲/内容
Java内存模型(JMM)
内存模型
重排序
顺序一致性
happens-before
as-if-serial
并发方案
volatile
作用
保证内存可见性
禁止指令重排序
保证单读/写原子性(32位),符合操作不保证,如i++
原理
内存屏障
happens-before
synchronized
Java对象头
monitor
基本用法
普通方法:锁住当前this对象
静态方法:锁住当前类对象
方法块:锁住指定对象
final域
final类不能被子类集成
final域不能被改变,底层有写屏障
final可以提高性能,JVM会缓存final变量(编译时静态绑定)
final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。
使用final关键字,JVM会对方法、变量及类进行优化。
CAS
原理
问题
ABA问题
开销问题
只能保证一个共享变量的原子操作
多线程
CPU核、进程和线程
CPU时间轮片机制
并发和并行
共享内存与CPU缓存
内存一致性
MESI协议
高并发编程的好处和问题
线程实现
阻塞同步
临界区
锁
可重入锁
公平锁/非公平锁
独享锁/共享锁
互斥锁/读写锁
乐观锁/悲观锁
自旋锁
偏向锁/轻量级锁/重量级锁
锁带来的问题
死锁
互斥使用
占有且等待
不可抢占
循环等待
活锁
饥饿
非阻塞同步
无同步方案
线程分类
内核线程
用户线程
守护线程
线程状态
新建
可运行
无期限等待
无Timeout参数的wait()方法
无Timeout参数的Thread.join()方法
LockSuport.park()方法
期限等待
sleep()方法
有Timeout参数的wait()方法
有Timeout参数的Thread.join()方法
LockSuport.parkNanos()方法
LockSuport.parkUntil()方法
阻塞
结束
调度方式
协同式
抢占式
锁优化
自旋锁
自适应自旋锁
锁消除
锁粗化
偏向锁
轻量级锁
重量级锁
线程创建方式
集成Thread类
实现Runnable接口
通过Callable和Future创建线程
并发特性
原子性:一个或多个操作,必须全部执行成功
有序性:禁止代码指令重排序,按照代码顺序执行
可见性:多线程间变量修改可见
并发工具
锁和工具
AQS
原理
数据结构
CLH节点增加和移出
优点
解决了子类实现同步器的大量细节问题,如获取同步状态、FIFO同步队列
采用模板模式,AQS实现大量通用方法,子类通过继承方式实现其抽象方法来管理同步状态
支持独占式和共享式同步状态的获取与释放
当有线程获取锁了,其他在此获取时需要阻塞,当线程释放锁后,AQS负责唤醒线程
支持多个条件变量,支持等待唤醒机制
ReentrantLock
可重入锁,递归无阻塞的同步机制
比synchronized更强大、灵活的锁机制,可减少死锁发生的概率
分公平锁和非公平锁
底层采用AQS实现,通过内部Sync集成AQS
读写锁
ReentrantReadWriteLock
读锁(共享锁)、写锁(排他锁)
支持公平、非公平性,可重入和锁降级
锁降级:遵循获取写锁、获取读锁在释放写锁的次序,写锁能降级为读锁
StampedLock
乐观锁,读写时配合戳一起使用
semaphore
信号量,现在同事访问共享资源的线程数
CountdownLatch
倒计时锁,允许一个或多个线程等待其他线程完成操作
CyclicBarrier
循环栅栏,可循环使用的同步线程屏障
Exchanger
线程协作工具,在这个同步点,两个线程交换数据
线程池
优势
降低资源消耗
提高响应速度
提高线程可管理性
提供延时定时线程池
线程池的选择
CPU密集型任务,可选择尽量少的线程数,如CPU核心数+1
IO密集型任务,可选择尽可能多的线程,如CPU核心数*2
混合型任务,如果执行时间相差不大,可进行拆分
优先级不同的任务,可选择优先队列PriorityBlockingQueue
Executor
ThreadPoolExecutor
核心属性
corePoolSize
maximumPoolSize
keepAliveTime
TimeUnit unit
BlockingQueue<Runnable> workQueue
ThreadFactory threadFactory
RejectedExecutionHandler handler
AbortPolicy
CallerRunsPolicy
DiscardOldestPolicy
DiscardPolicy
实现RejectedExecutionHandler接口自定义策略
核心方法
exec():提交不需要返回自的任务
submit():提交返回Future对象任务
shutdown():线程池置为SHUTDOWN状态,并等待线程执行interrupt()方法
shutdownNow():线程池置为STOP状态,尝试暂停所有任务
线程池分类
newCacheThreadPool()
newFixedThreadPool(int n)
newScheduledThreadPool(int n)
newSingleThreadExecutor()
ScheduledThreadPoolExecutor
Future
RunnableFuture(接口)
FutureTask
SchedualFuture(接口)
RunnabelSchedualedFuture(接口)
SchedualedFutureTask
CompleteFuture
ForkJoinTask
并发集合
ConcurrentHashMap
JDK 7
数据结构:数组加链表
加锁位置:锁定Segment
加入元素位置:头部,在resize中的rehash过程中,并发环境下可能形成死链
扩容后计算下标:hash&newSize
JDK 8
数据结构:数组+链表+红黑树
加锁位置:锁定每个位置的头节点
加入元素位置:尾部
扩容后计算下标:originalIndex或originalIndex+oldSize
BlockingQueue
ConcurrentLinkedQueue
CopyOnWriteArrayList
atomic
收藏
收藏
0 条评论
下一页