面试官:谈一谈你对synchronized的理解

Java中对象和Monitor

对象

对象中有对象头,实例数据

对象头(mark word)长啥样

hashcode,分代年龄,是否是偏向锁,加锁标识

Monitor

monitor 又称管程,也叫锁。是JVM层提供的,每一个对象对应一个monitor。

工作原理

  • 用了synchronized(obj)之后,对象的markword中就有个指针指向monitor的地址,并且monitor中的ownernull变为thread-1.
  • thread-2来抢占共享资源,发现monitor 已经被抢占了,就去阻塞队列里面排队,变成阻塞状态.
  • synchronized(obj) 执行完之后会唤醒阻塞队列中的线程,此时是非公平

轻量级锁

  • 加锁 每个线程在加锁的时候会产生一个锁记录,锁记录中的 lock-recoad-address 00 与 对象头中的markword cas交换,轻量级锁加锁成功
  • 冲突 同一个线程重新获取锁,会产生一个新的锁记录,因为已经加锁了,就cas不成功,锁记录的地址为null
  • 解锁 锁记录为null的话就表示是重入的锁,不为null就交换markword.

锁膨胀

  • 加锁 在刚才的冲突环节,如果不是自己的线程,那么会锁就会膨胀,对象的markword就指向Monitor地址 10 此时thread-1就进入entryList 阻塞队列中,等待唤醒.
  • 解锁 等thread-0 执行完之后,发现cas交换失败了,就会进行重量级锁的解锁,将Monitor 中的owner赋值null,并且唤醒EntryList中的线程.

偏向锁

  • 加锁 我们发现轻量级锁每次同一个线程还是需要cas检查,这也是很耗费性能的,JVM对这个进行了优化,默认是开启偏向锁.不采用锁记录和对象头交换的形式,而是直接将线程的地址和对象的markword交换,这样每次只需要看当前来的线程是本线程就不需要cas了.
相关推荐
Java水解20 分钟前
Spring Boot 配置文件深度解析
spring boot·后端
狗头大军之江苏分军26 分钟前
Node.js 性能优化实践,但老板只关心是否能跑
前端·后端
李拾叁的摸鱼日常35 分钟前
Java泛型基本用法与PECS原则详解
java·后端·面试
狗头大军之江苏分军36 分钟前
Node.js 真香,但每次部署都想砸电脑
前端·javascript·后端
帅那个帅1 小时前
go的雪花算法代码分享
开发语言·后端·golang
酒酿萝卜皮1 小时前
Elastic Search 聚合查询
后端
程序员清风1 小时前
阿里二面:新生代垃圾回收为啥使用标记复制算法?
java·后端·面试
sino爱学习1 小时前
Java 三元表达式(?:)的常见坑总结
java·后端
❀͜͡傀儡师1 小时前
Spring Boot函数式编程:轻量级路由函数替代传统Controller
java·spring boot·后端