当前位置: 首页 > news >正文

synchronized锁

在了解锁之前我们要先了解对象布局

什么是java对象布局

在JVM中,对象在内存中存储的布局可以分为三块区域,即实例化之后的对象

  • 对象头:分配的空间是固定的12Byte,由Mark Word(标记字段)和Class Pointer(类型指针)组成
  • 实例数据:即定义的数据字段,这些示例数据分配的空间是不固定的
  • 对齐填充:要求每个对象的总大小8 字节的整数倍,比如JVM是64Bit,即8Byte,然而一个类声明了一个布尔类型的字段,一个布尔类型1Byte,当该字段实例化后进入JVM堆中,就需要7Byte的填充数据补齐到8Byte

对象头 

对象头:分配的空间是固定的12Byte,由Mark Word(标记字段)和Class Pointer(类型指针)两部分组成

Mark Word(标记字段)

  • 64 位(开启指针压缩时也是 64 位存储,但部分位用于压缩编码)。
  • 存储内容随运行时状态而变:对象哈希码(hashCode)、GC 分代年龄、锁信息(偏向锁/轻量级锁/重量级锁指针)、线程持锁记录、类型、gc信息等。

Class Pointer(类型指针)

  • 也叫 Klass Word,指向对象对应的类元数据(Method …)
  • 在 64 位虚拟机中,如果开启了 Compressed Klass Pointers(类指针压缩),则占用 32 位,否则 64 位。

数组对象还有额外长度字段

  • 如果这是一个数组实例,在上面两部分之后还有一个 32 位的 length 字段,用于记录数组长度。
public class L {boolean b =false;
}
class main{public static void main(String[] args) {L l =new L();}
}

 上述L类声明了一个布尔类型的b字段,布尔类型占1byte,然而JVM为了补齐,填充了3Byte的数据,凑成了16Byte的l对象,其中对象头占12Byte,实例数据占1Byte,填充占3Byte

若改成

int i =1;

synchronized隐式锁

因为开发者无需手动申请或释放锁,而是通过关键字直接在代码中声明需要同步的代码块或方法

ReentrantLock显示锁

ReentrantLock 是 Java 中 java.util.concurrent.locks 包下的一个显式锁实现,它实现了Lock 接口,提供了比 synchronized 更灵活和细粒度的控制方式。

特点:1.可重入性:即一个线程在持有锁的情况下,可以再次获得该锁并不会被阻塞,内部会维护一个计数器,每次加锁计数器加 1,解锁时减 1,直到计数器归零,锁才真正释放。

2.公平锁: 可以构造一个公平的 ReentrantLock,保证等待时间最长的线程最先获得锁。这样虽然能降低线程饥饿风险,但在高并发情况下性能可能较低。

非公平锁(默认): 允许线程抢占式获得锁,不保证请求顺序,从而通常能获得更高的吞吐量,但可能存在线程饥饿问题。

3.多 Condition 支持:ReentrantLock 允许通过 newCondition() 方法创建一个 Condition 对象,可以用来实现比 Object.wait/notify 更细粒度的线程等待/唤醒机制。一个 ReentrantLock 可以创建多个 Condition,以满足不同等待条件的需求。

http://www.xdnf.cn/news/85429.html

相关文章:

  • 为啥低速MCU单板辐射测试会有200M-1Ghz的辐射信号
  • ZYNQ笔记(十二):SD卡读写txt
  • 【Git】Fork和并请求
  • 《MySQL 核心技能:SQL 查询与数据库概述》
  • CentOS笔记本合上盖子不休眠
  • WeakSet:JavaScript 中容易被忽视的“弱集合”
  • 2025年4月22日第一轮
  • 本地部署DeepSeek-R1模型接入PyCharm
  • Java常用正则表达式及使用方法
  • 【屠龙勇士】BIT睿信书院屠龙勇士心得分享
  • Buffer of Thoughts: Thought-Augmented Reasoningwith Large Language Models
  • 第八天 AI开发:NavMesh导航系统 对话系统:使用ScriptableObject存储对话数据 存档系统:JSON序列化保存数据
  • 在Windows上安装Git
  • UDP协议理解
  • Linux 系统中使用 OpenSSL 生成适用于 IIS 的证书
  • L2-2、示范教学与角色扮演:激发模型“模仿力“与“人格“
  • Selenium 在爬取过程中,网络响应被退出的解决方案
  • 机器学习第二篇 多变量线性回归
  • CF912E
  • PR网表出现assign该如何解决
  • 三网通电玩城平台系统结构与源码工程详解(一):系统概述与前端搭建
  • 第四届商师校赛 web 1
  • 【Git】Git的远程分支已删除,为何本地还能显示?
  • VSCode 用于JAVA开发的环境配置,JDK为1.8版本时的配置
  • 交易所开发:构建高效数字交易枢纽
  • Spring 事务实现原理,Spring 的 ACID是如何实现的?如果让你用 JDBC 实现事务怎么实现?
  • React.cloneElement的用法详解
  • go 编译的 windows 进程(exe)以管理员权限启动(UAC)
  • Spark-Streaming简介及核心编程
  • 详解Windows(六)——文件系统