Synchronized是实现多线程同步的机制,但是很多对Synchronized原理并不了解,本篇详解Synchronized原理@mikechen
Synchronized原理
Synchronized是解决多个线程之间访问资源的同步性,Synchronized 翻译为中文的意思是同步,也称之为”同步锁“。
Synchronized的实现原理主要涉及 Java 对象头、Monitor(监视器)对象、线程锁等相关概念,下面一一详解@mikechen
Java对象头
Java 对象头中存储了对象的元数据信息,其中包括一个标记位,用于表示该对象是否被锁定。
当一个线程尝试进入一个 Synchronized 代码块时,JVM 会在对象头中设置一个标记位来表示该对象已经被锁定,并把这个锁放入到线程的锁池中。
Java对象头主要包括两部分数据,如下图所示:
主要包含类型指针和标记字段:
1)类型指针(Klass Pointer)
是对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例;
2)标记字段(Mark Word)
用于存储对象自身的运行时数据,比如:GC分代年龄、锁状态标志、线程持有的锁、偏向线程 ID等等,它是实现轻量级锁和偏向锁的关键。
Monitor监视器
Monitor 对象是一种同步机制,是Synchronized实现原理的核心。
每个被锁定的对象都会与一个 Monitor 对象关联起来,Monitor描述为对象监视器,可以类比为一个特殊的房间,这个房间中有一些被保护的数据。
Monitor保证每次只能有一个线程,能进入这个房间进行访问被保护的数据,进入房间即为持有Monitor,退出房间即为释放Monitor。
下图是Synchronized同步代码块反编译后的截图:
可以很清楚的看见monitor的调用,主要就是上图红色的monitorenter和monitorexit来实现,获取锁与释放锁。
Synchronized锁升级
锁的升级也是 Synchronized 实现同步的关键,主要会涉及到无锁、偏向锁、轻量级锁、重量级锁。
如下图所示:
1.偏向锁
偏向锁是JDK6中引入的一项锁优化,大多数情况下,锁不仅不存在多线程竞争,而且总是由同一线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁。
3.轻量级锁
是指当锁是偏向锁的时候,被另外的线程所访问,偏向锁就会升级为轻量级锁。
轻量级锁在多线程竞争不激烈的情况下,可以有效地提高同步性能,但如果多个线程同时竞争同一个锁对象,轻量级锁的优化会失效,转而使用重量级锁,
4.重量级锁
重量级锁的实现需要依赖操作系统的底层支持,这种实现方式的代价比较高,会带来较大的性能消耗,所以放到最后升级为重量级锁。
以上就是Synchronized 原理的详解,更多线程同步,请查看:线程同步详解(4种常用线程同步方式)
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》