并发安全之同步锁

线程安全问题,本质多线程环境下代码执行的原子性、可见性、有序性得到保证
synchronized 可以保证原子性、可见性、有序性
例:两个线程同时执行 count ++
count++由多条cpu指令组:
1.线程从内存加载count到寄存器
2.执行count +1操作
3.把操作结果加载到内存
多线程环境下由于cpu时间片分配,导致随时会有线程上下文切换可能,这会导致多个线程对共享变量进行count ++ 操作时出现数据混乱问题
用synchronized 关键字给这个代码块加锁,可以保证count ++ 这个代码片段同一时间只能有一个线程A在执行,且上下文切换也不会让这个代码块被其他线程抢占执行,值得线程A释放这块代码锁,由其他线程去抢占

synchronized 应用

1.修饰实例方法
2.修饰静态方法
3.修饰代码块 synchronized(Object.class),指定加锁对象,在进入同步代码块前要获得指定对象的锁

锁的实现原理

多个线程抢占一把锁,怎么标识这个锁是否被抢占,这个锁被谁抢占,这个一定是有个地方存储锁的信息,这个地方就是锁对象的对象头,通过字节为识别锁的状态、锁的类别
对象在内存中的布局三个部分:对象头、实例数据、对齐填充
对象头:
1.对象类型指针:指向对象对应的Class对象
2. (mark word)对象标记存储结构 4字节:
hashCode
分代年龄 4位
同步锁标识记
偏向锁标记
偏向锁持有线程id
monitor 争抢锁的实现逻辑

锁类型

1.偏向锁
2.轻量级锁
3.重量级锁
偏向锁:只有一个线程抢占锁情况,通过CAS修改锁对象头锁标识为偏向锁,修改偏向锁id为抢占线程
轻量级锁:多个线程抢占锁时,偏向锁升级为轻量级锁,线程不会阻塞通过自旋方式去抢占锁,抢占锁的过程通过cas修改锁对象头标识,修改成功则抢占到锁
重量级锁: 轻量级锁自旋抢占锁超过一定自旋次数还没有抢占到锁,升级到重量级锁,重量级锁抢占过程是获取锁对象(synchronized修饰的对象)对应的monitor, monitor实现了抢占锁的逻辑(monitentenr表示获得锁,moniterexit表示释放锁,其他线程可以去强政府这个监视器)
monitor是依赖操作系统的muteLock(互斥锁来实现的),线程阻塞后会进入内核调度状态,线程的阻塞黄杏都涉及到用户态和内核态的切换,这个严重影响了性能,这也是为什么后面jdk版本加入偏向锁、轻量级锁,通过锁升级、锁消除、锁膨胀等手段优化synchronized同步锁

interrupted

线程的中断, interrupted是一个线程中断标识,在线程的run方法中try catche(interreuptedException){
}
就可以铺货到该中断异常,异常被获取到后,jvm会把interrupted进行复位,把线程的是否中断决定权交给线程逻辑编写者,也就是说,外部调用修改了这个线程的中断状态,只是告诉这个线程我想让你停止介绍,至于是不是要结束,由这个线程来决定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值