Java并发机制底层实现原理-synchronized

章节目录

  • synchronized的实现原理与应用

synchronized 重量级锁

1.6版本之前 synchronized 被称之为 重量级锁
1.6版本对 synchronized 进行了优化,主要优化的点在于 减少 获得锁和释放锁带
来的性能消耗,为实现这个目的引入了偏向锁、与轻量级锁。 

synchronized 实现同步的基础

Java中每一个对象都可以作为锁。
普通同步方法,锁是当前实例对象。
静态同步方法块,锁是当前类的Class对象。
对于同步方法块,锁是synchronized括号里配置的对象。

synchronized 同步锁的获取 底层原理
如下图所示:

2836699-fdb6d9bb82b6fdf3.png
synchronized 同步锁的获取 底层原理.png

synchronized锁的存储位置

synchronized 用的锁是存在java对象头里的。
对象头中的Mark-word 默认存储对象的hashcode、分代年龄、和锁标志位。
Mark-word 中存储的数据会随着锁标志位的变化而变化
轻量级锁-00
重量级锁-10
GC标记-11
偏向锁-01

锁的升级与对比
Java SE 1.6 当中锁一共有4种状态,级别从低到高一次为:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态。锁可以升级但不能降级,这种锁升级但不能降级的策略,目的是为了提高获得锁与释放锁的效率。

1.偏向锁原理

偏向锁的优点及初始化过程:

  • 加锁解锁不需要额外的资源消耗,只需要对比当前线程id在对象头中是否存储指向当前线程的偏向锁。如果存在,表示当前线程已经获得锁。如果测试失败,则查询当前mark word中的偏向锁标志是否设置成为1,如果没有设置,则使用CAS竞争锁(非偏向锁状态),如果设置了偏向锁标志,则尝试使用CAS将对象头的偏向锁指向当前线程。

偏向锁的撤销:

  • 偏向锁使用了一种等到竞争出现才释放锁的机制,当其他线程尝试竞争偏向锁的时候,持有偏向锁的线程才会释放锁。偏向锁的撤销,需要等待全局安全点,这个时间点上没有正在执行的字节码。它首先会暂停拥有偏向锁的线程,然后检查持有偏向锁的线程活着,如果线程不处于活动状态,则将对象头设置为无锁状态。如果线程仍活着,拥有偏向锁的栈会被执行完。

2.轻量级锁原理

轻量级锁加锁:

  • 线程在执行同步块之前,JVM会先在当前线程的栈桢中创建存储锁记录的空间,并将对象头中的mark word 复制到锁记录当中,然后线程尝试使用CAS将对象头中的 mark word 替换为指向锁记录的指针。如果成功,当前线程获得锁,如果失败,表示其他线程竞争锁,当前线程便尝试使用自旋锁来获取锁。

轻量级锁解锁

  • 轻量级解锁时,会使用原子的CAS将锁记录(Displaced Mark Word)替换回到
    对象头,如果成功,则表示没有发生竞争。如果失败,表示当前锁存在竞争,锁就会膨胀为重量级锁。

总结

优点缺点适用场景
偏向锁加锁和解锁都不需要额外的消耗,和执行非同步的方法相比只存在纳秒级差距如果线程间存在锁竞争,会带来额外的锁撤销的消耗适用于只有一个线程访问同步块的场景
轻量级锁竞争的线程不会阻塞,提高了应用的相应速率如果始终得不到竞争的线程,适用自旋会消耗cpu,造成cpu空转追求响应时间,同步块执行速度非常快
重量级锁线程竞争不使用自旋,不会消耗cpu线程阻塞,响应时间缓慢追求吞吐量,同步块执行速度较长

不同锁的优缺点

优点缺点适用场景
偏向锁加锁和解锁都不需要额外的消耗,和执行非同步的方法相比只存在纳秒级差距如果线程间存在锁竞争,会带来额外的锁撤销的消耗适用于只有一个线程访问同步块的场景
轻量级锁竞争的线程不会阻塞,提高了应用的相应速率如果始终得不到竞争的线程,适用自旋会消耗cpu,造成cpu空转追求响应时间,同步块执行速度非常快
重量级锁线程竞争不使用自旋,不会消耗cpu线程阻塞,响应时间缓慢追求吞吐量,同步块执行速度较长
一、数据采集层:多源人脸数据获取 该层负责从不同设备 / 渠道采集人脸原始数据,为后续模型训练与识别提供基础样本,核心功能包括: 1. 多设备适配采集 实时摄像头采集: 调用计算机内置摄像头(或外接 USB 摄像头),通过OpenCV的VideoCapture接口实时捕获视频流,支持手动触发 “拍照”(按指定快捷键如Space)或自动定时采集(如每 2 秒采集 1 张),采集时自动框选人脸区域(通过Haar级联分类器初步定位),确保样本聚焦人脸。 支持采集参数配置:可设置采集分辨率(如 640×480、1280×720)、图像格式(JPG/PNG)、单用户采集数量(如默认采集 20 张,确保样本多样性),采集过程中实时显示 “已采集数量 / 目标数量”,避免样本不足。 本地图像 / 视频导入: 支持批量导入本地人脸图像文件(支持 JPG、PNG、BMP 格式),自动过滤非图像文件;导入视频文件(MP4、AVI 格式)时,可按 “固定帧间隔”(如每 10 帧提取 1 张图像)或 “手动选择帧” 提取人脸样本,适用于无实时摄像头场景。 数据集对接: 支持接入公开人脸数据集(如 LFW、ORL),通过预设脚本自动读取数据集目录结构(按 “用户 ID - 样本图像” 分类),快速构建训练样本库,无需手动采集,降低系统开发与测试成本。 2. 采集过程辅助功能 人脸有效性校验:采集时通过OpenCV的Haar级联分类器(或MTCNN轻量级模型)实时检测图像中是否包含人脸,若未检测到人脸(如遮挡、侧脸角度过大),则弹窗提示 “未识别到人脸,请调整姿态”,避免无效样本存入。 样本标签管理:采集时需为每个样本绑定 “用户标签”(如姓名、ID 号),支持手动输入标签或从 Excel 名单批量导入标签(按 “标签 - 采集数量” 对应),采集完成后自动按 “标签 - 序号” 命名文件(如 “张三
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值