最全【Java并发实战】偏向锁-轻量级锁-重量级锁,阿里内部爆款架构师Kafka源码笔记开源

最后

每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。

如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份限量版的Java零基础宝典能够对你有所帮助。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

// do somethings

}

由于该方法是一个静态方法,那么它锁的是当前类的class对象。

3.通过方法块

public void sync3() {

synchronized(this) {

// do somethings

}

}

public void sync4() {

synchronized(MyTest.css) {

// do somethings

}

}

同步方法块是需要根据方法中具体同步的对象来实现的。

在上面代码中其实sync3()跟同步普通方法一样,锁的是当前实例对象;那么sync4方法就与同步静态方法一样,锁的是当前类的class对象。

从上面代码可以看出来的,我们通过使用synchronized关键字可以很简单的解决并发问题,但是其实是jvm底层通过使用一种叫内置锁的手段,简化了开发人员实现并发的复杂度,在jdk1.6以前 synchronized是基于重量锁实现的,即每次遇到同步代码都要获取锁,然后释放锁,在jdk1.6之后对其优化,根据不同场景使用不同的策略,这也就是 偏向锁、轻量锁、重量锁的来由。在介绍他们之前我先介绍一下另一个锁-自旋锁。听到这么多锁,是不是头晕,当初我学习的时候也是这样的。但是当你慢慢学习深入,你就会很容易的理解每个锁的作用

自旋锁


自旋锁顾明思意就是旋转等待的意思,那么它的作用是什么呢?

1.当前线程尝试去竞争锁

2.竞争失败,准备阻塞自己

3.但是并没有阻塞自己,而是采用自旋锁,进入自旋状态。

4.进入自旋状态,并且重新不断竞争锁。

5.如果自旋期间成功获取锁,那么结束自旋状态,否则进入阻塞状态。

如果在自旋期间成功获取锁,那么就减少一次线程的切换。

根据上面的解释我们可以很容易理解自旋锁的意义,因为CPU从内核状态切换至用户状态,线程的阻塞与恢复都会浪费资源的,但是通过自旋而不是去阻塞当前线程,那么就会节省这一个CPU状态的切换。

所以自旋锁适合在持有锁时间长,并且竞争不激烈的场景下使用。

使用-XX:-UseSpinning参数关闭自旋锁优化;-XX:preBlockSpin参数修改默认的自旋次数。

偏向锁


在实际场景中,如果一个同步方法,没有多线程竞争,并且总是由同一个线程多次获取锁,在这种场景下,如果每次还有阻塞线程,唤醒cpu从用户状态转核心态,那么对于cpu是一种资源的浪费,为了解决这类问题,就引入了偏向锁的概念。

“偏向”的意思是,偏向锁假设将来只有第一个申请锁的线程会使用锁(不会有任何线程再来申请锁),因此,只需要在Mark word中CAS记录owner(本质上也是更新,但初始值为空),如果记录成功,则偏向锁获取成功,记录锁的状态为偏向锁;否则说明有其他线程竞争,膨胀为轻量级锁。

具体的步骤如下:

1.访问同步代码块

2.检查对象头是都owner是否存储当前线程的id

3.如果没有,进行CAS尝试替换mark word中的owner。如果有执行同步代码块(代表获取锁成功)

4.修改成功(代表无竞争)owner修改为当前线程的id,执行同步代码块。修改失败(代表有竞争)进入撤销偏向锁,暂停线程并将owner置空,进入轻量级锁。

在这里插入图片描述

偏向锁无法使用自旋锁,因为一旦有其他线程申请资源,就破坏了偏向锁的假定。

如果你确定应用程序中所有的锁通常是在竞争状态,你可以通过JVM参数关闭偏向锁

UseBiasedLocking = false,那么程序会默认进入轻量锁状态。

轻量锁


偏向锁是为了解决同步代码在单线程下访问性能问题。

轻量级锁是为了解决减少无实际竞争情况下,使用重量级锁产生的性能消耗

轻量锁,顾名思义,轻量是相对于重量的来说的,使用轻量级锁时,不需要申请互斥量(mutex),而是将mark word中的信息复制到当前线程的栈中,然后通过CAS尝试修改mrak word并替换成轻量锁,如果替换成功则执行同步代码块。如果此时有线程2来竞争,并且他也尝试cas修改mark word但是失败了,那么线程2进入自旋状态,如果在自旋状态也没有修改成功,那么轻量锁将膨胀成重量级锁,mark word会被修改成重量锁标记(10,),线程进入阻塞状态。

总结

对于面试,一定要有良好的心态,这位小伙伴面试美团的时候没有被前面阿里的面试影响到,发挥也很正常,也就能顺利拿下美团的offer。
小编还整理了大厂java程序员面试涉及到的绝大部分面试题及答案,希望能帮助到大家,

在这里插入图片描述

在这里插入图片描述

最后感谢大家的支持,希望小编整理的资料能够帮助到大家!也祝愿大家都能够升职加薪!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

需要这份系统化的资料的朋友,可以点击这里获取

  • 28
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值