Java并发知识体系
2024-10-28 14:30:18 0 举报
AI智能生成
Java并发知识体系
作者其他创作
大纲/内容
并发理论基础
并发&并行
线程基础
线程&进程
Java线程的生命周期(6种状态)
start,sleep,join,yield等方法详解
start详解
Java线程的中断机制
Java线程间通信
volatile
等待唤醒机制
cas+park/unpark
synchronized+wait/notify/notifyAll
reentrantLock+Condfition(await/singal/singalAll)
管道输入输出流
Thread.join
管程
(jvm实现)synchronized
偏向锁
偏向锁延迟偏向
理解批量重偏向和批量撤销
1. 批量重偏向和批量撤销是针对类的优化,和对象无关。
2. 偏向锁重偏向一次之后不可再次重偏向。
3. 当某个类已经触发批量撤销机制后,JVM会默认当前类产生了严重的问题,剥夺了该类
的新实例对象使用偏向锁的权利
2. 偏向锁重偏向一次之后不可再次重偏向。
3. 当某个类已经触发批量撤销机制后,JVM会默认当前类产生了严重的问题,剥夺了该类
的新实例对象使用偏向锁的权利
当只有一个线程访问锁时,synchronized 的状态是偏向锁,只通过对比 Java 对象头中的一个标记位即可进行操作。
当有少量线程访问锁时,synchronized 的状态是轻量级锁,两个线程都要通过 CAS 来进行操作。
当有多个线程访问锁时,synchronized 的状态是重量级锁,三个线程都要通过互斥量获得锁,来进行操作
当有少量线程访问锁时,synchronized 的状态是轻量级锁,两个线程都要通过 CAS 来进行操作。
当有多个线程访问锁时,synchronized 的状态是重量级锁,三个线程都要通过互斥量获得锁,来进行操作
自旋优化
锁粗化
锁消除
(Java实现AQS)Lock+Condition
锁分类
公平锁
加锁失败时,添加到同步队列等待唤醒
非公平锁
加锁之前,先CAS竞争锁,加锁失败添加到同步队列
多线程模型
共享模型(JMM)
并发编程bug的源头
可见性问题
有序性问题
原子性问题
volatile原理
cas原理
CAS缺陷
自旋 CAS 长时间地不成功,则会给 CPU 带来非常大的开销
只能保证一个共享变量原子操作
ABA 问题
解决方案(版本号控制)
AtomicStampedReference<V>
cas应用
CAS 操作是由 Unsafe 类提供支持的,该类定义了三种针对不同类型变量的 CAS 操
作
作
happens-before原则
主存和工作内存交换8大原子操作
JAVA内存交互操作
lock(锁定)
unlock(解锁)
read(读取)
load(载入)
use(使用)
assign(赋值)
store(存储)
write(写入)
操作的规则
CPU高速缓存架构
多种缓存一致性协议
MESI 协议
。。。。
。。。。
伪共享问题
线程安全问题
分类
运行结果错误
活跃性问题(死锁,饥饿,活锁)
对象发布和初始化
线程安全问题解决方案
无锁
局部变量
不可变对象
final关键字
ThreadLocal
cas
atomic包下原子类
有锁
锁分类
线程要不要锁住同步资源
锁住
悲观锁
不锁住
乐观锁
等锁的过程
自旋锁:不停的去尝试获取锁
非自旋锁:阻塞型的
是否可以中断
可以
可中断锁
不可以
不可中断锁
同一个线程是否可以获取同一把锁
可以
可重入锁
不可以
不可重入锁
多个线程竞争时,是否需要排队
需要
公平锁
不需要
非公平锁
多线程能否共享一把锁
可以共享
共享锁
不可以共享
独占锁
synchronized锁竞争程度
偏向锁
轻量级锁
重量级锁
synchronized
Lock
基于AQS同步器(AbstractQueuedSynchronizer)
ReentrantLock
ReentrantReadWriteLock
StampedLock
并发工具类
atomic包下原子类
基本类型
AtomicInteger
AtomicLong
AtomicBoolean
引用类型
AtomicReference
AtomicStampedRerence(可以解决ABA问题)
AtomicMarkableReference
数组类型
AtomicIntegerArray
AtomicLongArray
AtomicReferenceArray
对象属性原子修改器
AtomicIntegerFieldUpdater
AtomicLongFieldUpdater
AtomicReferenceFieldUpdater
原子类型累加器(jdk1.8增加的类)
DoubleAccumulator
DoubleAdder
LongAccumulator
LongAdder
解决高并发环境下AtomicInteger,
AtomicLong的自旋瓶颈问题。
AtomicLong的自旋瓶颈问题。
原理
Striped64
线程池
ThreadPoolExecutor
ScheduledThreadPoolExecutor
线程协作
CountDownLatch(闭锁)
应用场景
让多个线程等待
让单个线程等待
实现原理
Semaphore(信号量)
应用场景
限流
CyclicBarrier
使用
构造方法
CyclicBarrier(int parties)
CyclicBarrier(int parties, Runnable barrierAction)
应用场景
多线程计算,合并
Exchanger
Phaser
ReentrantReadWriteLock
使用
注意事项
重入时升级不支持:持有读锁的情况下去获取写锁,会导致获取永久等待
重入时支持降级: 持有写锁的情况下可以去获取读锁
并发容器
Map
ConcurrentHashMap
ConcurrentSkipListMap
List
CopyOnWriteArrayList
Set
CopyOnWriteArraySet
ConcurrentSkipListSet
Queue
ArrayBlockingQueue
有界阻塞队列,先进先出,存取互相排斥
数据结构:静态数组
容量固定必须指定长度,没有扩容机制
没有元素的位置也占用空间,被null占位
锁:ReentranLock
存取是同一把锁,操作的是同一个数组对象,存取互相排斥
阻塞对象
LinkedBlockingQueue
无界阻塞队列,可以指定容量,默认值为Integer.MAX_VALUE,先进先出,存取互不干扰
数据结构:链表
锁分离:存取互不干扰,存取操作的是不同的Node对象
takeLock 取Node节点保证前驱后继不会乱
putLock 存Node节点保证前驱后继不会乱
阻塞对象
notEmpty
出队:队列count=0,无元素可取时,阻塞在该对象上
notFull
入队:队列count=capacity,放不进去元素时,阻塞在该对象上
入队
队尾入队,由last指针记录
出队
对首出队,由head指针记录
先进先出
线程池中为什么用LinkedBlockingQueue而不使用ArrayBlockingQueue?
锁分离
LinkedBlockingDeque
一个链表阻塞双端队列,无界可以指定容量,默认为Integer.MAX_VALUE
数据结构:链表(同LinkedBlockingQueue)
内部类Node存储元素
锁:ReentrantLock(同ArrayBlockingQueue)
存取是同一把锁
阻塞对象(同LinkedBlockingQueue)
notEmpty
无元素可取时,阻塞在该对象上(count==0)
notFull
放不进去时,阻塞在该对象上(count==capacity)
出队
入队
应用场景
常用于“”工作窃取“”算法,ForkJoinPooli使用的就是这种算法
Future
FutureTask
CompletionService
CompletableFuture
Fork/Join
ForkJoinPool
ForkJoinTask
高性能队列Disruptor
0 条评论
下一页