Synchronized总结

一、锁升级过程

java 复制代码
1、检测所对象的MarkWord里面,锁标志位01,无偏向。这是JVM给的初始值。
2、使用CAS将当前线程的ID替换MardWord的【锁线程ID】,如果成功则表示当前线程获得偏向锁,置偏向标志位01,
3、如果失败,则说明发生竞争,撤销偏向锁,进而升级为【轻量级锁】

4、多次尝试,通过当前线程使用CAS将对象头的MarkWord替换为锁记录指针,如果成功,当前线程获得锁,则依然处于轻量级状态。

5、如果自旋失败,并且超过自选次数5次,则升级为【重量级锁】。

二、Synchronized既是乐观也是悲观

java 复制代码
偏向锁、轻量锁、自旋锁都属于乐观锁。
重量级锁-Synchronized属于悲观锁

自旋锁尽可能的减少线程的阻塞,这对于锁的竞争不激烈,
且占用锁时间非常短的代码块来说性能能大幅度的提升,
因为自旋的消耗会小于线程阻塞挂起再唤醒的操作的消耗,
JVM有个很重要的参数就是自旋次数。

锁的内存模型

HotSpot是java的虚拟机,对象在内存中的存储分为三块区域:

1、对象头

2、实例数据

3、对齐填充

其中对象头又分为三块:markword、Klass Pointer、ArrayLength(假如对象为数组)

1、markword中包含了和Java对象息息相关的一些信息,它的实际大小一般和CPU字长保持一致,如在32位CPU上markword的大小一般为32位,即4字节。而在64位CPU上markword的大小一般为64位,即8字节

2、Klass Pointer Class 对象的类型指针,它指向对象对应的Class对象的内存地址。大小占4字节

在面试中,关于Markword的问题是非常常见的。以下是一些可能问到的问题:

1、什么是Markword?它在内存分配和垃圾回收中的作用是什么?

对象在内存的结构主要是3大块,对象头,实例数据,对其填充,对象头主要包含两大块,markwork和kclass point

2、Markword的存储结构是什么?

HashCode+分代年龄+锁标识

3、Markword的大小通常是多少?

4、Markword的锁标志位有什么作用?

偏向锁01 轻量级00 重量锁10

marwork这个文档写的很细介绍marwork

关于MarkWord面试相关MarkWord面试

相关推荐
C++chaofan1 天前
Java 并发编程:synchronized 优化原理深度解析
java·开发语言·jvm·juc·synchronized·
CodeAmaz7 天前
synchronized原理与使用详解
jvm·synchronized
C雨后彩虹7 天前
synchronized底层原理:JVM层面的锁实现
java·synchronized
Chen不旧7 天前
Java模拟死锁
java·开发语言·synchronized·reentrantlock·死锁
萧曵 丶8 天前
Synchronized 详解及 JDK 版本优化
java·多线程·synchronized
小萌新上大分18 天前
synchronized的8锁问题(区分默认用的是那把锁) 笔记云备份
java·java多线程·synchronized·synchronized关键字·synchronized用法·多线程买票问题·java锁机制
程序员三明治1 个月前
【Java】synchronized关键字详解:从字节码到对象头与锁升级
java·开发语言·juc·synchronized··锁升级
Jayden2 个月前
synchronized全解析:从锁升级到性能优化,彻底掌握Java内置锁
java·synchronized·synchronized面试·synchronized扫盲
佛祖让我来巡山2 个月前
深入理解Java内存模型:从诡异Bug到优雅解决
线程安全·synchronized·volatile·final·jmm