synchronized底层实现

synchronized
锁的是对象不是代码
锁定方法和非锁定方法可以同时执行

synchronized(Object){
-不能用String常量 ,Integer ,Long 等基础数据类型
}
因为 万一你把一个类库的值锁住了,别人也锁住了  会出现死锁

锁升级--

偏向锁  :第一个 去访问某把锁的线程,是没有给Object加锁的,只记录这个线程的id 
    如果线程争用,升级为自旋锁     , 两个线程一个线程占着锁,另一个线程自旋
自旋锁:不会进入就绪队列,会一直占用cpu,自旋10次,如果还得不到这把锁,就升级为重量级锁
    减少不必要的CPU上下文切换;在轻量级锁升级为重量级锁时,就使用了自旋加锁的方式

重量级锁:(不占cpu:意思就是 线程在等待队列里,等cpu调度)就是去操作系统(os)那里去申请资源 

自旋锁(占cpu,但是不访问操作系统),所以他是用户态去解决这个锁的问题,不经过内核态,
因此在加锁和解锁的效率上比经过内核态的效率高
在什么情况下 用自旋锁最好:

执行时间短(加锁代码)线程数少,用自旋
执行时间长,线程数多,用系统锁

锁升级的概念:
就比如说你要锁定一个对象,在这个对象头上的某两位来指定他到底锁的是什么类型的锁,在对象头上
还记录着当前线程的id,哪个线程申请了这把锁
偏向锁的概念就是:先不尝试对他加锁,只是记录线程的id值,就认为这个对象是这个线程的独有,下次这个线程
再来申请这把锁的时候,判断如果还是原来那个线程,就别加锁了,直接访问 ,效率高一些
如果不是原来的线程,他会进行锁升级,首先会尝试着自旋锁的升级,自旋锁就是,如果有一个线程占有这把锁,
再来一个线程的时候,就会在旁边循环,他不在等待队列,会占用cpu, 自旋10次,如果还是拿不到这把锁,就继续升级为重量级锁,这哥们儿就
wait了,经过os 进入了等待队列,不占用cpu了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值