Synchronized原理详解(3大实现原理图解)

Synchronized原理详解(3大实现原理图解)-mikechen

Synchronized是实现多线程同步的机制,但是很多对Synchronized原理并不了解,本篇详解Synchronized原理@mikechen

Synchronized原理

Synchronized是解决多个线程之间访问资源的同步性,Synchronized 翻译为中文的意思是同步,也称之为”同步锁“。

Synchronized的实现原理主要涉及 Java 对象头、Monitor(监视器)对象、线程锁等相关概念,下面一一详解@mikechen

 

Java对象头

Java 对象头中存储了对象的元数据信息,其中包括一个标记位,用于表示该对象是否被锁定。

当一个线程尝试进入一个 Synchronized 代码块时,JVM 会在对象头中设置一个标记位来表示该对象已经被锁定,并把这个锁放入到线程的锁池中。

Java对象头主要包括两部分数据,如下图所示:

Synchronized原理详解(3大实现原理图解)-mikechen

主要包含类型指针和标记字段:

1)类型指针(Klass Pointer)

是对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例;

2)标记字段(Mark Word)

用于存储对象自身的运行时数据,比如:GC分代年龄、锁状态标志、线程持有的锁、偏向线程 ID等等,它是实现轻量级锁和偏向锁的关键。

 

Monitor监视器

Monitor 对象是一种同步机制,是Synchronized实现原理的核心。

每个被锁定的对象都会与一个 Monitor 对象关联起来,Monitor描述为对象监视器,可以类比为一个特殊的房间,这个房间中有一些被保护的数据。

Monitor保证每次只能有一个线程,能进入这个房间进行访问被保护的数据,进入房间即为持有Monitor,退出房间即为释放Monitor。

下图是Synchronized同步代码块反编译后的截图:

Synchronized原理详解(3大实现原理图解)-mikechen

可以很清楚的看见monitor的调用,主要就是上图红色的monitorenter和monitorexit来实现,获取锁与释放锁。

 

Synchronized锁升级

锁的升级也是 Synchronized 实现同步的关键,主要会涉及到无锁、偏向锁、轻量级锁、重量级锁。

如下图所示:

Synchronized原理详解(3大实现原理图解)-mikechen

 

1.偏向锁

偏向锁是JDK6中引入的一项锁优化,大多数情况下,锁不仅不存在多线程竞争,而且总是由同一线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁。

3.轻量级锁

是指当锁是偏向锁的时候,被另外的线程所访问,偏向锁就会升级为轻量级锁。

轻量级锁在多线程竞争不激烈的情况下,可以有效地提高同步性能,但如果多个线程同时竞争同一个锁对象,轻量级锁的优化会失效,转而使用重量级锁,

4.重量级锁

重量级锁的实现需要依赖操作系统的底层支持,这种实现方式的代价比较高,会带来较大的性能消耗,所以放到最后升级为重量级锁。

以上就是Synchronized 原理的详解,更多线程同步,请查看:线程同步详解(4种常用线程同步方式)

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法