synchronized 原理

简介: 以重量级锁为例,T0、T1线程竞争锁时,通过对象头获取或创建Monitor对象。T0通过CAS成功设置owner为自身,获得锁;T1失败后自旋重试,若期间锁被释放则成功获取,否则进入等待队列阻塞,待解锁后被唤醒重试。

以重量级锁为例,比如 T0、T1 两个线程同时执行加锁代码,已经出现了竞争(代码如下)

synchronized(obj) { // 加锁
    ...
} // 解锁
  1. 当执行到行1 的代码时,会根据 obj 的对象头找到或创建此对象对应的 Monitor 对象(C++对象)
  2. 检查 Monitor 对象的 owner 属性,用 Cas 操作去设置 owner 为当前线程,Cas 是原子操作,只能有一个线程能成功
  1. 假设 T0 Cas 成功,那么 T0 就加锁成功,可以继续执行 synchronized 代码块内的部分
  2. T1 这边 Cas 失败,会自旋若干次,重新尝试加锁,如果
  1. 重试过程中 T0 释放了锁,则 T1 不必阻塞,加锁成功
  2. 重试时 T0 仍持有锁,则 T1 会进入 Monitor 的等待队列阻塞,将来 T0 解锁后会唤醒它恢复运行(去重新抢锁)
相关文章
|
6月前
|
Java 数据中心
Java 并发核心:CountDownLatch、CyclicBarrier、Semaphore 原理吃透 + 生产级实战
本文深度解析JUC三大核心并发工具:CountDownLatch(一次性等待)、CyclicBarrier(可重用屏障)和Semaphore(信号量限流)。从AQS原理、源码关键点、生产实战、易混淆对比到避坑指南,五维讲透多线程协作本质,助力高并发系统稳定落地。
526 1
|
6月前
|
存储 人工智能 搜索推荐
智教相伴,守正前行 ——AI 发展对幼儿教育的利弊探析
人工智能技术正快速渗透幼儿教育领域,以个性化教学、资源普惠、效率提升为幼儿教育注入新动能。同时,过度依赖 AI 也带来情感陪伴缺失、创造力受限、隐私安全等风险。本文辩证分析 AI 对幼儿教育的利好与弊端,提出技术赋能需坚守教育本质、坚持人机协同,让 AI 成为幼儿健康成长的助力而非阻力。
|
5月前
|
缓存 安全 iOS开发
开源的 macOS 应用管理器和系统清理器
PureMac 是一款免费开源的 macOS 应用管理与系统清理工具,支持彻底卸载应用、清除残留文件及缓存日志等垃圾,释放磁盘空间。无订阅、无遥测、不收集任何用户数据,原生安全,智能扫描不误删。(239字)
557 1
|
11月前
|
监控 Linux 调度
【赵渝强老师】Docker容器的资源管理机制
本文介绍了Linux CGroup技术及其在Docker资源管理中的应用。通过实例演示了如何利用CGroup限制应用程序的CPU、内存和I/O带宽使用,实现系统资源的精细化控制,帮助理解Docker底层资源限制机制。
962 6
|
11月前
|
Java Go 开发工具
【Java】(8)正则表达式的使用与常用类分享
正则表达式定义了字符串的模式。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
608 1
|
SQL 消息中间件 Kafka
Flink SQL 详解:流批一体处理的强大工具
Flink SQL 是 Apache Flink 提供的 SQL 引擎,支持流批一体处理,统一操作流数据与批数据,具备高性能、低延迟、丰富数据源支持及标准 SQL 兼容性,适用于实时与离线数据分析。
1391 1
|
存储 Kubernetes 安全
云计算分类与主流产品
云计算已广泛应用于政府、企业和个人生活,主要分为私有云、公有云、混合云和多云。服务模式以IaaS、PaaS、SaaS为主,未来将向S2S模式发展。公有云具备规模大、价格低、灵活性强等特点,而私有云则更注重数据安全和资源控制。混合云结合多种云的优势,提供更灵活的架构。此外,云存储、虚拟桌面、开发测试、电子政务等场景广泛应用,OpenStack、Kubernetes等开源产品也推动了云计算的发展。
1502 0
|
存储 消息中间件 NoSQL
跟着大厂学架构01:如何利用开源方案,复刻B站那套“永不崩溃”的评论系统?
本文基于B站技术团队分享的《B站评论系统的多级存储架构》,解析其在高并发场景下的设计精髓,并通过开源技术栈(MySQL、Redis、Java)复刻其实现。文章深入讲解了多级存储、数据同步、容灾降级等关键设计,并附有完整代码实现,助你掌握大厂架构设计之道。
751 0
|
存储 芯片
51单片机--LCD1602
51单片机--LCD1602
844 1
|
关系型数据库 MySQL 测试技术
记录一次后端接口抖动的排查过程
某天下午,测试新功能时发现页面接口偶尔变慢,平均十次调用中有三到四次出现3秒以上的延迟。排查了接口、数据库和服务器资源后未发现问题,最终锁定为K8s节点的负载均衡策略导致。测试环境仅有一个公网IP,SLB轮询四个Pod(其中三个为空),造成周期性延迟。移除空Pod后问题解决。
532 6

热门文章

最新文章