多线程与高并发PPT模板
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
01
AtomicRefere nce
02
AtomicStamp edReference
引用类
AtomicReference AtomicStampedReference
可用来解决CAS的ABA问题 内部使用Pair将Reference和 stamp包装起来
atomic包
字段类
AtomicLon gFieldUpd ater
02 notify不释放锁
03 流程
调用wait后将线程放入等待队列, 并释放当前锁 调用notify后,会把线程从等待 队列移动到阻塞队列,可重新竞 争锁
锁
lock
Reentra ntLock
Reentran tReadWr iteLock
Conditi on
Stampe dLock
ReentrantLock
adder
DoubleAdder
adder
超高并发使用,分为多个cell分别进行累加,get的时候 将cell的值加一起
03
锁
锁
synchronized lock CAS
锁
synchronized
1.6优
A
化
可重
B
入
不可
C
中断
只有一个
D
等待队列
wait、
E
notify
1.6优化
无锁
MarkWord: 对象hashcode和分代年龄
1.6优化 偏向锁
9,300 Million
单击此处添加标题
单击此处输入你的正文,文字是您思想 的提炼,为了最终演示发布的良好效果, 请尽量言简意赅的阐述观点;根据需要 可酌情增减文字,以便观者可以准确理 解您所传达的信息。
MarkWord: 偏向线程ID,偏向时间, 分代年龄
如果锁标记为可偏向状态,则尝试使用 CAS替换对象头的markWord为当前 线程id
AtomicBoolean
atomic包
数组类
AtomicInte gerArray
AtomicLon gArray
AtomicRefe renceArray
数组类
AtomicIntegerArray AtomicLongArray AtomicReferenceArray
atomic包
引用类Βιβλιοθήκη Baidu
当有另一个线程尝试获取这个锁时,则 升级为轻量级锁
1.6优化
轻量级锁
0
1
MarkWord: 指向轻量 锁记录的指针
0
2
超过N个线程竞争或者 自旋超过一定次数,则
膨胀为重量级锁
0
3
线程数量N和自旋次数 由自适应自旋决定,即
通过复杂的算法得出
重量级锁
MarkWord: 指向
01 重量级锁的指针
涉及用户态到核
由于高速缓存的操作单元为一个缓存行,而缓存行上其他元素的 invalid会导致当前元素一同invalid,从而降低并发度,单独一个缓 存行可避免此问题
LongAdder
细节
有一个普通变量base可计数,CAS失败后使用cell数组 通过线程生成随机数,定位cell数组位置 定位到的cell数组位置不为null,则可以尝试CAS增加当前cell 初始化cell数组、填充新的cell元素、扩容cell数组三个操作互斥,会使用CAS乐观锁竞争cellbusy 竞争失败或者CAS失败可以尝试其他方式,比如说重新生成随机数再次定位,或者CAS操作base变量 多次失败则触发cell数组扩容操作,进一步提高并发度
可重入锁
在已经被锁定状态,
判断是否是当前线程
1
持有,如果是则将sta te加1
可以实现可中断锁
3
2
可以实现公平锁
非公平锁性能更好, 但可能造成饥饿
4
可以有多个等待队列
01
与 锁 类 似 , 03 只不过不记 录获取的线
程
02 内 部 类 继 承 自AQS框架,
实现share
相关方法
并发工具类
Exchanger
需两个线程访问, 如果只有一个线程, 会阻塞等待另一个
线程到来
A
内部实现: CAS+park
B
02
atomic包
atomic包
简单类 数组类 引用类 字段类 adder
01
countDown方法 不阻塞,await方
法阻塞
并发工具类
CyclicBarrier
循环栅栏,可循环使用,一 般用于多个线程互相等待
使用lock和condition实 现
也可实现CountDownLatch 功能,在初始化的时候多加
一个Runnable参数
并发工具类
Semaphore
信号量Java实 现
多线程与高并发
演讲人
202X-06-08
01
并发工具类
并发工具类
CountDownLatch CyclicBarrier Semaphore Exchanger
并发工具类
CountDownLatch
03
不可重复使用,一
般用于某些线程等
一堆线程操作
02
内部类继承自AQS 框架,实现share
相关方法
02 心态的切换
03 流程
获取锁失败则添加到阻塞队列 锁释放后通知阻塞队列中的一个 线程抢占锁
1.6优化
锁消除
编译器检测到不会涉及到多线程竞争,则会把锁消除
1.6优化
锁粗化
编译器检测到相邻代码多个小锁,则会粗化为一个大锁
wait、notify
01 必须在synchronized 中使用
wait会释放锁,
atomic包
简单类
AtomicInte ger
01
AtomicLon g
02
内 部 使 用04 Unsafe类的 CAS操作,底 层指令lock
cmpxchg
03
AtomicBool ean
AtomicInteger
AtomicLong
内部转换为Integer,true为1
简单类
内部使用Unsafe类的CAS操作,底层指令 lock cmpxchg
01 LongAdder
02 2DoubleAdder
03
超高并发使用,分为多个cell分别进行累加,get的时候将cell 的值加一起
LongAdder
将并发操作拆分到多个cell,提高 并发度 缓存行 细节
LongAdder
缓存行
单个cell为一个long的包装,使用了@sun.misc.Contended注解, 保证该long变量占用单独的一个缓存行
AtomicInt egerFieldU pdater
AtomicRef erenceFiel dUpdater
字段类
AtomicIntegerFie ldUpdater AtomicLongField Updater AtomicReference FieldUpdater
atomic包
adder