并发编程
2021-11-18 11:22:56 0 举报
并发变成知识点总结与串联
作者其他创作
大纲/内容
例如
线程不安全,取值和写回之间,不能保证没有其他线程修改,不能保证
显式锁
如果拿不到锁就直接放弃,或者进行其他的处理逻辑,例如去排队、陷入阻塞等
读取volatile变量到local
独享锁
典型应用
虽然线程当前持有了这把锁,但是如果想再次获取这把锁,也必须要先释放锁后才能再次尝试获取
值来实现重入
LockSupport
突然不想获取了,那么也可以在中断之后去做其他的事情,不需要一直傻等到获取到锁才离开
可见性问题
读锁
通用范式:首先,声明共享变量为volatile;然后,使用CAS的原子条件更新来实现线程之间的同步;同时,配合以volatile的读/写和CAS所具有的volatile读和写的内存语义来实现线程之间的通信
如果线程现在拿不到锁,并不直接陷入阻塞或者释放 CPU 资源,而是开始利用循环,不停地尝试获取锁
synchronized
通过monitorenter进行加锁
API指导硬件锁
锁分类
CAS保证原子性
临界资源
公平锁
实现精准唤醒
加锁流程
互斥访问
假设所有对资源访问都是没有冲突的,不阻塞线程执行,一旦遇到冲突,使用CAS来鉴别解决冲突
当有第一个线程来访问它并尝试获取锁的时候,它就将这个线程记录下来,以后如果尝试获取锁的线程正是偏向锁的拥有者,就可以直接获得锁
CAS
过程拆解
原理拆解
修改变量值
瞎比抢锁,可以插队
local值写回
非公平锁
通过minitorexit退出锁
偏向锁
是否自旋
获取锁:从内存中获取资源
AQS同步等待队列
线程/进程使用的
ReentrantLock
重量级锁
使用
数据结构
使用者不需要手动写代码去获取锁和释放锁,非逻辑问题也不会产生死锁
插入内存屏障,即lock指令,让其他线程可见
公平策略
悲观锁
可以被多个线程同时获得
线程当前已经持有这把锁了,能在不释放这把锁的情况下,再次获取这把锁
LOCK(ReentrantLock)
是否可中断
synchronized状态
解决方法
可重入锁
是否独享
只能同时被一个线程获得
实现方法
多线程相对于单线程复杂主要是因为存在
Compare And Swap
自旋锁
可中断锁
应用
禁止拷贝到CPU缓存
非自旋锁
认为每次临界区的操作都会产生冲突,所以当多个线程同时访问临界区资源,锁会阻塞线程执行
可中断(lockInterrruptibly)
轻量级锁
不可中断
乐观悲观
一旦线程申请了锁,就没有回头路了,只能等到拿到锁以后才能进行其他的逻辑处理
sync也可重入
可精确唤醒
wait/notify也依赖monitor对象
不可中断锁
重量级锁会让其他申请却拿不到锁的线程进入阻塞状态
volatile
原子变量类(atomic)
支持公平与非公平
Condition
加锁
乐观锁
临界区
队首判定实现公平
实现进程互斥的那段代码叫做
共享资源在并发场景下存在
内存中的共享变量,不同的线程会各自拷贝到自己CPU的cache或寄存器中处理,从而出现了隔离
JVM层面的锁
进行阻塞和中断处理
特征
共享资源
是否可重入
隐式锁
共享锁
一次只允许一个
线程会通过自旋的形式尝试获取锁,而不会陷入阻塞
使用者需要手动写代码去获取锁和释放锁,使用不当产生死锁
state
释放锁:处理后的对象同步到内存
实现互斥
详解
CAS和volatile是整个并发框架的基石
原子性
无法精确唤醒
非可重入锁
架构
写锁
一个线程修改了某一个共享变量的值时,其他线程不能立即感知这个修改
等锁队列队首最先获得锁,不可以插队抢锁
0 条评论
回复 删除
下一页