【Java八股-第七期】Sychronized 锁 - Java基础

提纲:

🔥Sychronized 锁

  • 原理

  • 偏向锁

  • 轻量级锁

  • 重量级锁

🎈面试八股真题

  • 1、说一下线程之间是如何通信的

  • 2、CAS的原理是什么

  • 3、CAS有什么缺点

  • 4、引用类型有哪些?有什么区别?

一、Sychronized 锁

1. 原理

  • 使用对象中的 monitor 管程实现加锁与解锁,JDK 中为了提高效率,将 Sychronized 锁根据是否发生并发争抢分为了偏向锁,轻量级锁,和重量级锁

2.偏向锁

  • 1、通过修改对象头中的偏向锁标记为 1,并且将 HashCode 与 Age 部分替换为当前持有偏向锁的线程 ID

  • 2、在线程获取偏向锁时,若 ThreadID 就是自己,就直接获取,没有额外开销,若 ThreadID不是指向自己,且没有发生争抢,就进行冲偏向

  • 3、偏向锁重偏向发生一定次数,JVM 就会认为不该添加偏向锁,并为当前类的所有对象以及以后创建的对象都撤销偏向锁

3.轻量级锁

  • 1、轻量级锁的原理是通过在线程栈中创建一个锁记录,在锁记录中保存锁对象头的信息,并将标记加锁情况的两位改为 10 表示轻量级锁,将对象头中其他部分改为锁记录的指针

  • 2、在线程获取轻量级锁时,根据加锁情况的两位发现加了轻量级锁,若锁记录指向自己的线程栈,则在线程栈中再添加一条空的锁记录,用来表示锁重入,在释放时按后进先出的顺序弹出锁记录

  • 3、若当前持有轻量级锁的线程不是自己,则发生了争抢,但轻量级锁不会立刻升级为重量级锁,而是线程在原地 while 自旋一定次数后,若还没获取到锁,就升级为重量级锁,自旋的次数是 JVM动态决定的,根据自旋的成功与否对其进行加减

4.重量级锁

  • 1、通过 monitor 管程来进行加锁,monitor 中主要有 Owner 指向当前持有锁的线程,EntryList 表示等待队列,以链表的方式存储被 Sychronized 阻塞的线程,WaitSet 表示调用了 wait 方法进行等待的线程队列

  • 2、在线程获取锁时,将对象头中的锁信息改为 00 表示重量级锁,并调用 monitorEnter 指令获取对象的 monitor 管程,将对象头中其他部分替换为 monitor 的指针,将 monitor 的 Owner 指向当前线程

  • 3、线程获取锁时,若对象已经加了重量级锁,就通过对象头的 monitor 指针找到 monitor,并根据 Owner判断是否是锁重入,如果不是,就进入等待队列 EntryList 中,并进入 Blo

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

代码鹿のJAVA八股面试题总结 文章被收录于专栏

【📫专栏目录在最底部📫】 - 本专栏适合于JAVA已经入门的学生或人士,有一定的编程基础。 - 本专栏特点: 本专刊囊括了JAVA、Spring、计算机网路、操作系统、计算机网络、MySQL、算法与数据结构、中间件等一系列知识点,总结出了高频面试考点(附有答案),事半功倍,为大家春秋招助力。 - 本专栏内容分为五章

全部评论

相关推荐

挣K存W养DOG:他的价值在于把他家里积攒的财富回馈给社会
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务