synchronized关键字的底层实现

news/2024/5/17 16:39:43 标签: synchronized, , jvm

synchronized_0">介绍synchronized关键字的底层之前,先要了解对象在内存中存储的布局。

  • 在Java虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)、对齐填充(Padding)。
  • 其中对象头包括两部分信息,一部分使用于存储对象自身的运行时数据,如哈希码、GC分代年龄、状态标志、线程持有的、偏向线程ID、偏向时间戳等。
  • 对象头的另一部分是类型指针,即对象指向它的类元数据的指针虚拟机通过这个指针来确定这个对象是哪个类的实例。

在这里插入图片描述
因此Java识别对象是否存在是在虚拟机中通过对象头中的标志来判断的,因此从对象头中的指向重量级的指针开始认识synchronized的底层实现。

对于synchronized的对象,指针是指向的一个monitor对象的起始地址,每一个对象实例都会有一个monitor。monitor是跟随对象创建以及销毁的,同时线程在获取对象的时候也可以自动生成。

synchronized_13">对于synchronized修饰代码块

根据虚拟机规范要求,在执行monitorenter指令时,首先要尝试获取对象,也就是上文我们提到了monitor对象。如果这个对象没有被定,或者当前线程已经拥有了这个对象的,那么就把的计数器(_count)加1。当然与之对应执行monitorexit指令时,的计数器(_count)也会减1。

synchronized_18">对于synchronized修饰方法

synchronized修饰方法时,不是通过monitor对象来进行的判断的,在修饰方法是通过ACC_SYNCHRONIZED标识,Java虚拟机通过验证ACC_SYNCHRONIZED标识来判断是否是一个需要同步的方法。

synchronizedhttpsbaijiahaobaiducomsid1612142459503895416wfrspiderforpcJava_29">以上就对于synchronized关键字的底层理解,该文章中引用了https://baijiahao.baidu.com/s?id=1612142459503895416&wfr=spider&for=pc以及《深入理解Java虚拟机》


http://www.niftyadmin.cn/n/1366689.html

相关文章

人才外包目前都需要精通哪些语言?

自从.NET问世以来,程序员都很关心的一个问题是「该学Java或.NET」。我也在挣扎,该「该继续Java的研究,或者该开始准备培养.NET的知识」。 当然,最好是能两者兼顾,但是每个人的时间都很有限,想要兼顾两者&am…

html页面调用iframe嵌入页面中的方法

首先创建一个html页面&#xff0c;在其中通过iframe标签插入一个嵌入页面&#xff0c;通过src嵌入 <!DOCTYPE html> <html><head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width, initial-scale1…

数据库的乐观锁、悲观锁的理解

乐观锁的理解&#xff1a; 乐观锁顾名思义就是很乐观&#xff0c;别人在拿数据的时候认为别人不会修改数据&#xff0c;所以不会上锁&#xff0c;但是在更新数据时会判断在此期间别人有没有修改这个数据&#xff0c;因为使用版本号机制来实现乐观锁。 实现乐观锁的方法&#…

Java模式理解 阶段二:工厂模式

在Java模式的工厂模式中分为&#xff1a;普通工厂模式、多个工厂模式、抽象工厂模式 1、普通工厂模式 在普通工厂模式中&#xff0c;其实是对实现同一接口的类进行实例的创建&#xff0c;在工厂中进行类的创建。 代码示例如下&#xff1a; 1、创建一个其它类都需要继承的接…

SpringBoot使用Redis做数据缓存的问题

在SpringBoot中&#xff0c;可以通过Redis做数据的缓存&#xff0c;用户在查询数据时可以直接从缓存中取&#xff0c;减少数据库的压力。 1、首先在SpringBoot中加入Redis的依赖 <!--集成redis&#xff0c;client改用jedis--><dependency><groupId>org.sprin…

Linux常用命令(centos 7)

Linux配置网卡命令&#xff1a;vi /etc/sysconfig/network-scripts/ifcfg-ens33 将onboot改为yes打开防火墙&#xff1a;systemctl start firewalld关闭防火墙&#xff1a;systemctl stop firewalld查看防火墙状态&#xff1a;firewall-cmd --state查看端口状态&#xff1a;fir…

Tomcat配置阿里云SSL证书

记录一次令我蛋疼的tomcat配置SSL证书 在阿里云平台获取到SSL证书&#xff0c;并下载&#xff0c;里面有两个文件 将证书copy到tomcat下的conf文件夹下&#xff0c;然后配置server.xml文件 修改内容如下&#xff1a; <Connector port"443" protocol"org.a…

成为好的程序员的建议

1.多看代码&#xff0c;无论好坏&#xff0c;保持代码敏感度。 代码方面&#xff0c;我认为首先要看代码&#xff0c;多看代码&#xff0c;因为无论如何要保持自己对代码的敏感。大家可能经常自己吐槽是一个码农&#xff0c;天天不管需求在哪里&#xff0c;只管代码码哪里&…