线程锁级synchronize分析

为什么要有线程锁

多线程修改同一个共享资源或者变量时会存在线程安全的问题,比如a线程修改i值为1,b线程修改i值为2,因为线程运行是异步的,这就会造成一个问题,当a先运行结束i值就为1,反之i就为2,这就造成了不确定性,会来带一系列的问题

有哪些线程锁

1.乐观锁:cas操作,自旋通过对比原来的值来修改为新的值,线程一直运行
2.悲观锁:直接加锁,造成阻塞
3.重入锁:一个线程多次获得锁,当线程调用加锁的A方法,而A又调用加锁的B方法就需要重入
4.共享锁:读锁,每个锁都不互斥,相当于无锁
5.读写锁:同时拥有读锁与写锁2把锁,读锁与读锁共享,读锁与写锁互斥,写锁与写锁互斥,适用于读多写少
6.偏向锁:当只有线程A去获得锁时,对象会记录获得锁的指针,以此对比
7.轻量级锁:A与B线程互相抢占锁,通过自旋的方式获得锁

synchronize是什么锁

synchronize是可重入的锁,可以从乐观锁升级为偏向锁、轻量级锁最终膨胀为悲观锁
在这里插入图片描述

synchronize是怎么实现锁的

1.先要了解markword:每个对象在jvm存储的时候都会有3个部分组成:对象头,对象实例,对齐补充
对象头又分为2部分:markword存储了锁标记,classpoint对象指针
2.monitorObject:监视器,用来监视对象和锁
3.加锁方法执行过程:

1.monitor对象调用monitorEnter获得锁(修改锁标记位)
2.执行synchronize修饰的代码
3.调用monitorExit释放锁,再次修改锁标记位

思考synchronize几种锁效率提升在哪里

1.偏向锁:通过上面了解到markword中存入了线程的指针,通过对比线程指针来判断锁,这个时候线程是不需要阻塞的,直接运行,效率提高
2.轻量级锁:它通过自旋,来修改markword指向的线程,可以自适应自旋的次数来调节效率,与偏向锁不同的是这里采用了自旋(也就是乐观锁)
3.重量级锁:都说重量级锁消耗大,大在哪里

1.需要阻塞线程
2.当锁释放后,需要通知到别的线程
3.得到锁释放的信息号后,需要唤醒
4.唤醒后又要去抢占锁

乐观锁真的能解决线程安全嘛

乐观锁的实现:cas(object,offset,except,update)
1.通过offset找到object对应字段的值
2.比较与预期值except是否一致
3.一致,修改为update值
通过几个步骤来看与:if(old == except) old = update没有区别,那么如果这样怎么可能解决线程安全呢
于是在底层源码中发现,还有一个东西就是lock锁(这里的lock是操作系统层面的锁不是java类lock),也就是锁在cas之前会先获得一个lock锁再去执行cas操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值