浅谈ReentrantLock加锁原理以及AQS队列

本文探讨了Java对象布局,重点讲解了ReentrantLock的加锁原理和AQS(AbstractQueuedSynchronizer)队列。内容包括对象头的组成,JVM与HotSpot的区别,以及ReentrantLock作为同步工具相比synchronized的优势和实现方式,特别是其公平与非公平锁的策略。还介绍了AQS队列中Node对象的特性。
摘要由CSDN通过智能技术生成

java对象布局

  • 组成

    • 对象头

    • 数据

    • 填充(如果正好到8的倍数了就不用对其)

  • 64位机器中有12个字节的对象头,对象的大小是8的倍数

什么是java的对象头?

对象的第一个部分,是所有对象都有的

虚拟机位数 头对象结构 说明
32/64bit Markword 存储对象的hashcode、锁信息、分代年龄或gc标记信息
32/64bit klass pointer/Class Metadata Address 类型指针指向对象的类元数据,JVM通过这个指针确定是哪个类的实例

java 对象头由什么组成?

Markword + Class Metadata Address = 12 byte

当前使用的虚拟机是什么? (cmd > java -version 查看)

什么是JVM? 什么是HotSpot?

  • JVM 可以理解成一种 标准/规范
  • HotSpot 可以理解成一种 产品/实现
  • openjdk ------ 项目 / C++ 开发, 可以这样理解openjdk就是 HotSpot 的开源项目

gc 从 survive —> old 要来回折腾16次,也就是数值达到15 因为在对象头中对应4位 0~15

Markword -------- 64bit

Class Metadata Address -----32bit 有的也写成64bit 因为有的VM开启了指令压缩(32bit) 有的没开启(64bit)

两个加在一起不就正好是96bit = 12byte了么

对象状态?

  • 无状态 new出来的时候
  • 偏向锁
  • 轻量
  • 重量锁
  • gc标记

并发编程当中的锁-------ReentrantLock(同步)

为什么要用多线程呢?

因为我们要保证互斥,也就是说我们在开发业务的时候,写在Controller 里面,假如两个客户同时访问我们的网站的某一个变量i,这个时候我们就需要加锁,否则的话我们看到的结果就会不一样。

synchronized (同步) 关键字

synchronized 是一个重量级锁,需要调用OS(在1.6之前)

在jdk1.6之前 原理是一个重量锁

也就是说当我们调用这个线程方法的时候,jvm会调用一个native方法,然后会调用到操作系统函数(mutex),当下一个线程想进来的时候会先阻塞,就是操作系统中讲的那个临界区问题

注:这里的native是本地的意思,本地方法,用c++写的不是用java写的

在jdk1.7以后就完全变成了jvm来实现,不会再涉及到操作系统

ReentrantLock

自旋锁

其实就是操作系统里面讲的那个有一个临界变量,还是用代码写一下吧

volatile int status = 0;

void lock(){
   
    //compareAndSet的意思就是当是0的时候就变成1
    while(!compareAndSet(0,1)){
   
        
    }
}

void unlock(){
   
    status 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值