【面试官】你先说说synchronized的实现原理

  • 面试官:知道可重入锁有哪些吗?
  • 面试官:你先说说synchronized的实现原理?
  • 面试官:那synchronized有什么缺点?
  • 面试官:为什么上下文切换要保存当前线程状态?
  • 面试官:可以怎么解决synchronized资源消耗吗?
  • 面试官:那轻量级锁没有缺点吗?
  • 👉以【面试官面试】形式覆盖Java程序员所需掌握的Java核心知识、面试重点
  • 📚本期是《Java系列》,其他系列博客请订阅专栏《Java Offer训练营》
  • ❤创作不易,不妨点赞、收藏、关注支持一下

文章目录

  1. 可重入锁
  2. synchronized实现原理
    1. synchronized的缺点
    2. 保存当前线程状态
    3. 解决synchronized资源消耗
    4. 轻量级锁缺点

1. 可重入锁

面试官:知道可重入锁有哪些吗?

知道的面试官。可重入意味着获取锁的粒度是线程而不是调用,我了解的主要有ReentrantLock、sychronized都是可重入锁。

2. synchronized实现原理

面试官:你先说说synchronized的实现原理?

好的,synchronized的实现是基于monitor的。

是这样,任何对象都有一个monitor与之关联,当monitor被持有后,对象就会处于锁定状态

而在同步代码块的开始位置,在编译期间会被插入monitor'enter指令

当线程执行到monitorenter指令时,就会尝试获取monitor的所有权,获取得到则获得锁资源。

2.1 synchronized的缺点

面试官:那synchronized有什么缺点?

缺点是资源消耗是比较大,因为它是属于重量级锁

  1. synchronized需要频繁的获得锁、释放锁,这会带来了不少性能消耗。

  2. 另外没有获得锁的线程会被操作系统进行挂起阻塞、唤醒。

    唤醒操作需要保存当前线程状态,切换到下一个线程,也就是进行上下文切换

    上下文切换是很耗费资源的一种操作。

2.2 保存当前线程状态

面试官:为什么上下文切换要保存当前线程状态?

emmm就跟读英文课文时查字典一样,我们要先记住课文里的页数,查完字典好回到英文课文。

而CPU需要保存当前线程的状态,来保证可以切换到上一个线程的状态。

2.3 解决synchronized资源消耗

面试官:可以怎么解决synchronized资源消耗吗?

JDK在这方面是引入了偏向锁、轻量级锁、重量级锁,也就是锁升级

多线程环境其实有各种不同的场景,这三种锁就是为了适应各种不同场景,来使并发的效率最高。

  1. 只有一个线程访问同步代码块的场景的话,会进入偏向锁状态。

    偏向锁会偏向访问它的线程,使其加锁、解锁不需要额外的消耗。

  2. 少量线程竞争的场景的话,偏向锁会升级为轻量级锁

    而轻量级使用CAS操作来获得锁,CAS操作不需要获得锁、释放锁,减少了像synchronized带来的上下文切换资源消耗。

2.4 轻量级锁缺点

面试官:那轻量级锁没有缺点吗?

有的,没有获得锁的线程会自旋,这需要消耗CPU的。

另外如果自旋10次失败的话,为了减少CPU的消耗,轻量级锁会升级为重量级锁,也就是回到了类似synchronized重量级锁的同步场景。

📚以【面试官面试】形式覆盖Java程序员所需掌握的Java核心知识、面试重点,其他系列博客请订阅专栏《Java Offer训练营》


创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️❤️

#java面试题##大厂##大厂面试##多线程##java#
Java Offer训练营 文章被收录于专栏

👉覆盖Java程序员所需掌握的Java核心知识、面试重点 👉成体系知识帮你在后端进阶,每一道面试官问答助你怒怼大厂面试官,收获大厂offer 👉《Java Offer训练营》包含Java系列、Redis系列、MySQL系列、Kafka系列、ZooKeeper系列、JVM系列、多线程系列等等 👉花费大量精力去制作本专栏,创作不易各位的支持就是我创作的最大动力

全部评论
2 既然引入了轻量级锁,那么你再说synchronized资源消耗大 是不是有点歧义
点赞
送花
回复
分享
发布于 04-01 20:19 河南
666
点赞
送花
回复
分享
发布于 04-20 21:49 广东
滴滴
校招火热招聘中
官网直投
支持大佬
点赞
送花
回复
分享
发布于 04-25 23:38 广东

相关推荐

18 66 评论
分享
牛客网
牛客企业服务