多线程与高并发
2021-04-22 09:21:00 0 举报
AI智能生成
多线程与高并发
作者其他创作
大纲/内容
volatile
含义
作用
保证线程可见性
MESI
缓存一致性协议
但不能保证线程的数值正确
禁止指令重排序
在单例模式的双重校验中要对变量添加volatitle,否则会出现指令重排导致数据错误的问题
jvm初始化对象-> 赋值->添加对象引用
单例模式
懒汉
创建直接初始化
调用时再初始化
线程安全问题
双重检验锁
变量加volatile
饿汉
线程
特殊情况
锁的对象发生变化,则锁将变化
只能保证线程读可见,不能保证线程安全
基础概念
线程的启动方式
继承Thread重写run方法
实现Runable接口
Executorrs.newCachedThrad
方法
sleep
线程睡眠一会
yield
让出一下cpu,重新进入队列
join
一个线程加入一个线程,等待另一个线程的结束
线程的生命周期
生命周期
新生
已创建资源,调用start之前
就绪
等待cpu调度
运行
cpu运行期间
死亡
程序正常结束
认为中断,调用stop方法
程序抛出未捕获的异常
阻塞
sleep方法
等待I/O资源
join 方法(代码中执行,强制阻塞其他线程,优先执行当前线程)
关键字
new
Ready
cpu未执行
Running
cpu运行
Teminated
线程结束
TimidWating
Wating
Blocked
synchronized
线程同步
概念
怎么加锁
方法上加锁 synchronized 方法名
会对对当前的对象加锁
不能用 常量当锁
Integer
Long
基础数据类型
方法上写加锁读不加锁
产生脏读
锁种类
锁升级
偏向锁
一个线程使用时候使用
记录线程id加锁,判断是不是原来的线程
自旋锁
执行时间短使用
执行线程少
线程超过一定次数升级
重量级锁
10次以后升级为重量级进入os等待队列
执行时间长
执行线程多
可重入锁
synchronized可重入
一个同步方法调用另一个同步方法,已经拥有某个对象的锁,再次申请还会得到该对象的锁
子类调用父类的同步方法
synchronized
自动释放锁
ReentrantLock
需要手动释放锁
异常锁
产生异常锁会被释放
底层实现
被锁对象上加前两位锁的状态来判断是否被锁,不是代码
概念
锁定某个对象
早期
重量级-OS
和automic的区别
CAS
定义
无锁优化,自旋锁
Compare And Set
用法
Atomic开头
定义
子主题
调用
count.ubcrementAndGet()
原理
修改前获取期望值,通过期望值和目标值判断是否相等再修改
是否会出现判断完一样,赋值出现数据错误
cpu支持,不会出现
weakCompareAndSetObject
ABA问题
期望值先修改为新的值再修改为旧的值,当要修改发现没有修改就会修改成功
产生的问题
基础类型无问题,女朋友跟你复合,中间经历和别的女人
解决方案
添加版本号
Ato
UnSafe
直接修改jvm虚拟机内存的数据
直接操作内存
子主题
直接生成类的实例
allocateInstance
直接操作类或实例变量
obectFieldOffeset
getInt
getObject
0 条评论
下一页