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 解锁后会唤醒它恢复运行(去重新抢锁)
相关文章
|
4月前
|
Java 数据中心
Java 并发核心:CountDownLatch、CyclicBarrier、Semaphore 原理吃透 + 生产级实战
本文深度解析JUC三大核心并发工具:CountDownLatch(一次性等待)、CyclicBarrier(可重用屏障)和Semaphore(信号量限流)。从AQS原理、源码关键点、生产实战、易混淆对比到避坑指南,五维讲透多线程协作本质,助力高并发系统稳定落地。
452 1
|
9月前
|
Java Go 开发工具
【Java】(8)正则表达式的使用与常用类分享
正则表达式定义了字符串的模式。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
535 1
|
9月前
|
监控 Linux 调度
【赵渝强老师】Docker容器的资源管理机制
本文介绍了Linux CGroup技术及其在Docker资源管理中的应用。通过实例演示了如何利用CGroup限制应用程序的CPU、内存和I/O带宽使用,实现系统资源的精细化控制,帮助理解Docker底层资源限制机制。
842 6
|
12月前
|
存储 消息中间件 NoSQL
跟着大厂学架构01:如何利用开源方案,复刻B站那套“永不崩溃”的评论系统?
本文基于B站技术团队分享的《B站评论系统的多级存储架构》,解析其在高并发场景下的设计精髓,并通过开源技术栈(MySQL、Redis、Java)复刻其实现。文章深入讲解了多级存储、数据同步、容灾降级等关键设计,并附有完整代码实现,助你掌握大厂架构设计之道。
597 0
|
关系型数据库 MySQL 测试技术
记录一次后端接口抖动的排查过程
某天下午,测试新功能时发现页面接口偶尔变慢,平均十次调用中有三到四次出现3秒以上的延迟。排查了接口、数据库和服务器资源后未发现问题,最终锁定为K8s节点的负载均衡策略导致。测试环境仅有一个公网IP,SLB轮询四个Pod(其中三个为空),造成周期性延迟。移除空Pod后问题解决。
466 6
|
存储 芯片
51单片机--LCD1602
51单片机--LCD1602
797 1
|
消息中间件 存储 缓存
一文了解清楚kafka消息丢失问题和解决方案
今天分享一下kafka的消息丢失问题,kafka的消息丢失是一个很值得关注的问题,根据消息的重要性,消息丢失的严重性也会进行放大,如何从最大程度上保证消息不丢失,要从生产者,消费者,broker几个端来说。
846 0
|
网络协议 Java 数据处理
(一)Java网络编程之计网基础、TCP-IP协议簇、TCP、UDP协议及腾讯QQ通信原理综述
就目前而言,多数网络编程的系列的文章都在围绕着计算机网络体系进行阐述,但其中太多理论概念,对于大部分开发者而言,用途甚微。因此,在本系列中则会以实际开发者的工作为核心,从Java程序员的角度出发,详细解读Java的网络编程核心内容。
604 0
|
存储 Java 索引
深入学习Java集合之ArrayList的实现原理
深入学习Java集合之ArrayList的实现原理
276 0