synchronized的锁升级原理

前言:synchronized是多线程经常使用到的线程同步方法。在jdk1.6以后进行了锁升级的优化。本篇文章讲述的就是锁升级的过程。

一、锁升级的各个阶段

无锁状态->偏向锁->轻量级锁(自旋锁)->重量级锁

二、锁升级的过程和原理

无锁->偏向锁

一个对象一开始创建出来的时候是通常是偏向锁状态

偏向锁->轻量级锁

当有另一个线程来竞争的时候,就会升级为轻量级锁。竞争的2个线程会使用CAS争抢将自己线程栈中的lock record地址写入对象头的markword中。谁先写成功,谁就获得锁。没成功的就会不断的自旋使用CAS来等待获取锁机会。自旋会消耗cpu,因此当自旋数量过多时会消耗大量的cpu。

轻量级锁->重量级锁

当某个线程的自旋次数超过一定数量(大多数是10次)或者自旋的线程的数量超过内核的二分之一就会升级为重量级锁。
当Synchronize升级为重量级锁的时候,会有一个指向互斥量(monitor对象)的指针,这个monitor对象定义了_WaitSet和_EntryList两个队列,在下面我们会说到这两个队列的作用。除此之外,monitor对象中还有个_owner指针指向锁的持有者
首先,当一个线程去竞争锁,它会被放进_EntryList中去竞争,如果竞争成功,_owner指针就会指向当前线程,同时_count+1,如果竞争失败,会重新回到_EntryList中。如果一个线程被调用了wait(),那么会释放当前持有锁,_count-1且当前线程进入_WaitSet等待被唤醒。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值