Java锁机制(Synchronized)[无锁、偏向锁、轻量级锁、重量级锁]

Java锁机制(Synchronized)

JVM内存结构

在了解Java锁机制前,先来复习一下JVM的内存结构

image-20210718142659781

对象、对象头、结构

Java的对象包含了三个部分:对象头、实例数据、对齐填充字节。

image-20210718152058413

  • 对齐填充字节是为了满足Java对象的大小必须是8bit的倍数这一条件而设计的。

  • 实例数据就是在你初始化对象时,设定的属性和状态的内容(属性和方法)。

  • 对象头存放了一些对象本身运行时的信息,对象头包含了两部分:Mark Word和Class Pointer。相较于实例数据,对象头属于一些二外的存储开销,所以它被设计的极小,来提高效率。

    • Class Pointer就是一个指针,它指向了当前对象类型所在的方法区中的类型数据。
    • Mark Word存储了很多和当前对象运行时锁状态有关的数据(重点)

image-20210718153610023

​ 通过这张表我们可以看到Mark Word只有32bit,并且它是非结构化的。这样在不同的锁标志位下,不同的字段而已重用不同的比特位,因此达到节省空间的作用。

​ 我们先关注Mark Word的最后两位,这两位代表了锁标志位,分别对应着:无锁、偏向锁、轻量级锁、重量级锁这四种状态。

Synchronized

大家都知道在Java中synchronized关键字可以用来同步线程。synchronized被编译后会生成monitorenter和monitorexit两个字节码指令,依赖这两个字节码指令来进行线程同步。

我们写一段验证代码

public class TestSync {
   
	private int num=0;
	 public void test(){
   
	 	for(int i
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值