【多线程系列】你先说说synchronized的实现原理

面试官:听说你精通多线程,那我就考考你吧

面试官:不用慌尽管说,错了也没关系😊。。。

以贴近现实的【面试官面试】形式来分享技术,本期是《多线程系列》,感兴趣就关注我吧❤️

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

嗯嗯知道的。

我了解的主要有ReentrantLock、sychronized都是可重入锁。

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

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

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

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

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

面试官思考中...

面试官:那synchronized有什么缺点

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

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

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

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

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

面试官思考中...

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

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

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

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

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

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

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

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

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

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

面试官思考中...

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

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

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

面试官抓抓脑袋,继续看你的简历...

得想想考点你不懂的😰

未完待续。。。。。。

好了,今天的分享就先到这,我们下期【多线程系列】继续。

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

相关推荐
c++之路18 分钟前
C++23概述
java·c++·c++23
专注API从业者1 小时前
Open Claw 京东商品监控选品实战:一键抓取、实时监控、高效选品
java·服务器·数据库
摇滚侠1 小时前
DBeaver 导入数据库 导入 SQL 文件 MySQL 备份恢复
java·数据库·mysql
keep one's resolveY2 小时前
SpringBoot实现重试机制的四种方案
java·spring boot·后端
天空属于哈夫克32 小时前
企业微信API常见的错误和解决方案
java·数据库·企业微信
摇滚侠3 小时前
VMvare 虚拟机 Oracle19c 安装步骤,远程连接 Oracle19c,百度网盘安装包
java·oracle
梁萌3 小时前
idea报错找不到XX包的解决方法
java·intellij-idea·启动报错·缺少包
Agent产品评测局3 小时前
生产排期与MES/ERP系统打通,实操方法详解 —— 2026企业级智能体自动化选型与实战指南
java·运维·人工智能·ai·chatgpt·自动化
阿丰资源4 小时前
基于Spring Boot的电影城管理系统(直接运行)
java·spring boot·后端
呱牛do it4 小时前
企业级门户网站设计与实现:基于SpringBoot + Vue3的全栈解决方案(Day 8)
java