说一下 synchronized 底层实现原理?(高薪常问)

简介: 说一下 synchronized 底层实现原理?(高薪常问)

一、syn锁住的是对象,对象里边的组成如下:
Java的对象布局
必须是要求对象的大小必须是8的整数倍
1.首先是有一个object header
2.填充数据 :当对象大小不足8的倍数的时候,他会把当前对象填充成8的倍数,假如他现在本身就是8的byte的倍数,此时填充数据就不用了
3.成员变量 :就是咱们成员变量

二、锁升级
2.1 偏向锁
线程要尝试去加锁,他会去判断当前这个mark-word里边是否包含线程id,如果没有线程id的话,他会去利用cas把自己的线程id写入到mark-word里边去第二次这个线程再次过来的时候,他会去判断当前这个mark-word里边是否包含线程id,如果有了的话,他就会把他自己的线程id和对象头里边的线程id进行对比,如果发现是一样的此时就标识获得到了锁
如果你在没加锁的情况打印对象头:他默认就是 无锁可偏向,如果你没加锁的情况计算了hashCode码,无锁不可偏向,
如果此时你加锁无法成为偏向锁,直接膨胀成一把轻量级锁

2.2 轻量级锁
1、 升级成轻量级锁三个条件
a、你现在已经是无锁不可偏向,此时加锁那么他就直接是一把轻量级锁
b、没有关闭延迟偏向锁打开,他会自动成为轻量级锁
c、如果程序出现交替执行,他也会成为一把轻量级锁
2、原理
a、首先方法压栈,此时这个方法栈帧就压栈,栈帧种就创建两个和锁有关系的空间 displace hrd ,owner
b、他会将锁里边的mark-word里边信息拷贝到hrd种
c、他会用栈帧owner 指针去指向我们的对象头
d、对象头中轻量级指针会指向当前创建出来的这个栈帧
e、锁会把当前的状态修改成00
f、如果说完成了以上4件事情,那么此时才表示加锁成功,这把锁就是属于当前线程的

2.3 重量级锁
1、原理
a、Java如果发现要创建一把重量级锁,我们Java就会为我们创建一个C++的ObjectMonitor,会让对象头中monitor指向我们这个ObjectMonitor对象如果你进入到锁内部时,这个ObjectMonitor他会 发起汇编指定 monitorenter,当你出syn代码代码块的时候,他会发出monitorexit指令如果你在执行syn过程中出现了异常,其实上他还是会执行monitorexit这样一个指令
b、对象头里边monitor指针会指向 ObjectMonitor 对象,当多个线程来加锁的时候他,他们就会执行monitorenter 指令,进入到 ObjectMonitor进入到entrylist中等待抢锁,他们会利用cas 来进行抢锁,如果抢锁成功,ObjectMonitor,他会把他内部的owner的指针去指向咱们抢锁成功 线程,然后会让计数器+1,如果此时是抢锁的线程是持有锁的线程,那么此时count就会再+1 ,释放锁的时候,把count进行--,直到count== 0的时候就把owner 置为null,如果你对线程调用wait方法,此时这些被wait的线程他就会进入到waitSet中,只有当你去调用notifyall方法的时候他才会从新开始这样一套流程
c、如果是同步方法,那么他执行的 指令 acc_synchronized ,但是这哥们是隐式调用

目录
相关文章
|
6月前
|
存储 监控 安全
吃透synchronized实现原理
吃透synchronized实现原理
86 0
|
3月前
|
安全 Java 容器
【Java集合类面试二十七】、谈谈CopyOnWriteArrayList的原理
CopyOnWriteArrayList是一种线程安全的ArrayList,通过在写操作时复制新数组来保证线程安全,适用于读多写少的场景,但可能因内存占用和无法保证实时性而有性能问题。
|
17天前
|
存储 缓存 安全
ConcurrentHashMap的实现原理,非常详细,一文吃透!
本文详细解析了ConcurrentHashMap的实现原理,深入探讨了分段锁、CAS操作和红黑树等关键技术,帮助全面理解ConcurrentHashMap的并发机制。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
ConcurrentHashMap的实现原理,非常详细,一文吃透!
|
3月前
|
Java 调度
【多线程面试题十四】、说一说synchronized的底层实现原理
这篇文章解释了Java中的`synchronized`关键字的底层实现原理,包括它在代码块和方法同步中的实现方式,以及通过`monitorenter`和`monitorexit`指令以及`ACC_SYNCHRONIZED`访问标志来控制线程同步和锁的获取与释放。
|
6月前
|
Java
面试官:实战中用过CountDownLatch吗?详细说一说,我:啊这...
【5月更文挑战第4天】面试官:实战中用过CountDownLatch吗?详细说一说,我:啊这...
45 1
|
6月前
|
Java API
【并发编程】吃透Synchronized
【并发编程】吃透Synchronized
29 1
|
6月前
|
安全 Java 开发者
Java并发编程中的线程安全性探究
在Java编程中,线程安全性是一个至关重要的问题,涉及到多线程并发访问共享资源时可能出现的数据竞争和不一致性问题。本文将深入探讨Java并发编程中的线程安全性,介绍常见的线程安全性问题以及解决方法,帮助开发者更好地理解和应对在多线程环境下的挑战。
|
Java 编译器
synchronized 和 volatile 的区别是什么?(高薪常问)
synchronized 和 volatile 的区别是什么?(高薪常问)
85 2
|
安全 Java
面试官:谈谈你对synchronized的了解?
面试官:谈谈你对synchronized的了解?
面试官:谈谈你对synchronized的了解?
|
存储 安全 Java
面试必问之 ConcurrentHashMap 线程安全的具体实现方式(下)
ConcurrentHashMap 是 Java 并发包中提供的一个线程安全且高效的 HashMap 实现,以弥补 HashMap 不适合在并发环境中操作使用的不足,本文就来分析下 ConcurrentHashMap 的实现原理,并对其实现原理进行分析!
面试必问之 ConcurrentHashMap 线程安全的具体实现方式(下)