Java程序员必会Synchronized底层原理剖析

synchronize底层实现原理 synchronize底层实现原理 相信对Java程序员来说,synchronized关键字对大家来说并不陌生,当我们遇到并发情况时,优先会想到用synchronized关键字去解决,synchronized确实能够帮助我们去解决并发的问题,但是它会引起一些其他问题,比如最突出的一点就是程序效率问题,不过后面随着JDK1.6对synchronized关键字做出了许多优化,让synchronized和java.util.concurrent.locks.ReentrantLock等并发包中的类效率差不多。下面 阅读详情

synchronized作为Java程序员最常用同步工具,很多人却对它的用法和实现原理一知半解,以至于还有不少人认为synchronized是重量级锁,性能较差,尽量少用。

但不可否认的是synchronized依然是并发首选工具,连volatile、CAS、ReentrantLock都无法动摇synchronized的地位。synchronized是工作面试中的必备技能,今天就跟着一灯一块深入剖析synchronized的底层原理。

1. synchronized作用

synchronized是Java提供一种隐式锁,无需开发者手动加锁释放锁。保证多线程并发情况下数据的安全性,实现了同一个时刻只有一个线程能访问资源,其他线程只能阻塞等待,简单说就是互斥同步。

2. synchronized用法

先看一下synchronized有哪几种用法?

使用位置被锁对象示例代码
实例方法实例对象public synchronized void method() {
……
}
静态方法class类public static synchronized void method() {
……
}
实例对象实例对象public void method() {
Object obj = new Object();
synchronized (obj) {
……
}
}
类对象class类public void method() {
synchronized (Demo.class) {
……
}
}
this关键字实例对象public void method() {
synchronized (this) {
……
}
}

可以看到被锁对象只要有两种,实例对象和class类。

  • 由于静态方法可以通过类名直接访问,所以它跟直接加锁在class类上是一样的。

  • 当在实例方法、实例对象、this关键字上面加锁的时候,锁定范围都是当前实例对象。

  • 实例对象上面的锁和class类上面的锁,两者不互斥。

3. synchronized加锁原理

当我们使用synchronized在方法和对象上加锁的时候,Java底层到底怎么实现加锁的?

当在类对象上加锁的时候,也就是在class类加锁,代码如下:

/**
 * @author 一灯架构
 * @apiNote Synchronized示例
 **/
public class SynchronizedDemo {

    public void method() {
        synchronized (SynchronizedDemo.class) {
            System.out.println("Hello world!");
        }
    }

}
复制代码

反编译一下,看一下源码实现:

可以看到,底层是通过monitorenter和monitorexit两个关键字实现的加锁与释放锁,执行同步代码之前使用monitorenter加锁,执行完同步代码使用monitorexit释放锁,抛出异常的时候也是用monitorexit释放锁。

写成伪代码,类似下面这样:

/**
 * @author 一灯架构
 * @apiNote Synchronized示例
 **/
public class SynchronizedDemo {

    public void method() {
        try {
            monitorenter 加锁;
            System.out.println("Hello world!");
            monitorexit 释放锁;
        } catch (Exception e) {
            monitorexit 释放锁;
        }
    }

}
复制代码

当在实例方法上加锁,底层是怎么实现的呢?代码如下:

/**
 * @author 一灯架构
 * @apiNote Synchronized示例
 **/
public class SynchronizedDemo {

    public static synchronized void method() {
        System.out.println("Hello world!");
    }

}
复制代码

再反编译看一下底层实现:

这次只使用了一个ACC_SYNCHRONIZED关键字,实现了隐式的加锁与释放锁。其实无论是ACC_SYNCHRONIZED关键字,还是monitorenter和monitorexit,底层都是通过获取monitor锁来实现的加锁与释放锁。

而monitor锁又是通过ObjectMonitor来实现的,虚拟机中ObjectMonitor数据结构如下(C++实现的):

ObjectMonitor() {
    _header       = NULL;
    _count        = 0; // WaitSet 和 EntryList 的节点数之和
    _waiters      = 0,
    _recursions   = 0; // 重入次数
    _object       = NULL;
    _owner        = NULL; // 持有锁的线程
    _WaitSet      = NULL; // 处于wait状态的线程,会被加入到_WaitSet
    _WaitSetLock  = 0 ;
    _Responsible  = NULL ;
    _succ         = NULL ;
    _cxq          = NULL ; // 多个线程争抢锁,会先存入这个单向链表
    FreeNext      = NULL ;
    _EntryList    = NULL ; // 处于等待锁block状态的线程,会被加入到该列表
    _SpinFreq     = 0 ;
    _SpinClock    = 0 ;
    OwnerIsThread = 0 ;
  }
复制代码

图上展示了ObjectMonitor的基本工作机制:

  1. 当多个线程同时访问一段同步代码时,首先会进入 _EntryList 队列中等待。

  2. 当某个线程获取到对象的Monitor锁后进入临界区域,并把Monitor中的 _owner 变量设置为当前线程,同时Monitor中的计数器 _count 加1。即获得对象锁。

  3. 若持有Monitor的线程调用 wait() 方法,将释放当前持有的Monitor锁,_owner变量恢复为null,_count减1,同时该线程进入 _WaitSet 集合中等待被唤醒。

  4. 在_WaitSet 集合中的线程会被再次放到_EntryList 队列中,重新竞争获取锁。

  5. 若当前线程执行完毕也将释放Monitor并复位变量的值,以便其他线程进入获取锁。

线程争抢锁的过程要比上面展示得更加复杂。除了_EntryList 这个双向链表用来保存竞争的线程,ObjectMonitor中还有另外一个单向链表 _cxq,由两个队列来共同管理并发的线程。


 

高薪程序员&面试题精讲系列64之你熟悉synchronized吗?说说它的底层原理,如何对其优化? 一. 面试题及剖析 1. 今日面试题 你熟悉synchronized吗? synchronized的底层原理是怎么样的? 如何对synchronized进行优化? 2. 题目剖析 今天的题目,其实考察的是关于线程安全方面的内容,synchronized和lock锁都是用于保证线程安全的锁技术。在多线程方面,线程安全是考察时的重中之重。面试时,基本上就是先问了不了解多线程,接着就会问怎么保证线程安全,差不多这就是”线程3连“了。 二. synchronized锁 1. 简介 sync.. 阅读详情

相关推荐

“Agent Harness”和“Harness Engineering”

摘要:2026年AI工程化领域,"Agent Harness"(AI代理运行控制系统)与"Harness Engineering"(马具工程方法论)常被混淆。前者是管理AI代理非推理事务的技术实体(工具调用、记忆管理、安全约束等7层架构),后者是设计优化该系统的工程学科。研究表明,优化的Harness设计可使同一模型性能提升10倍。两者关系如同"马具"与"制具工艺":Harness Engineering指导Agent Harn

几十年资深高级架构师,技术专家的技术笔记。专注C、Java、Python、微服务、云原生、AI工程化及高并发系统分布式架构实战,分享源码剖析、性能调优与架构治理经验。 838

深入解析Synchronized锁底层原理

深入解析Synchronized锁的底层实现原理

码星人 2177

别再只会插卡了!用示波器实测SIM卡上电时序与通信波形(附故障排查)

本文深入解析了SIM卡通信的电气信号与时序规则,通过示波器实测波形揭示SIM卡上电时序与通信协议的关键细节。从VCC、CLK、RST、DATA四路信号的协同工作,到ATR(Answer to Reset)的解析,再到常见故障的波形诊断与排查方法,为硬件工程师提供了实用的调试指南。文章还分享了高级调试技巧与现代化工具链搭建建议,帮助提升物联网设备SIM卡通信的可靠性与效率。

weixin_42567279的博客 325

Java synchronized关键字的底层实现以及锁升级优化的原理【一万字】

介绍了synchronized关键字实现锁的底层原理以及JDK对于synchronized做出的锁升级优化!

终生学习践行者 4845

文献阅读笔记:量子微波测量技术综述

量子微波测量技术研究进展:量子微波测量技术利用里德堡原子与微波电场的相干相互作用,突破了传统测量方法的物理限制。该技术基于电磁诱导透明效应和里德堡原子能级跃迁原理,通过激光激发原子并监测光谱变化来测量微波电场强度。相比传统方法,量子微波测量具有超高灵敏度(理论极限可达nV/cm)、宽动态范围(超过100dB)、小型化等显著优势,且测量结果可直接溯源至普朗克常数。典型实验系统包括光源、原子气室和探测器,采用光谱法、干涉法等多种测量方法。近年来,该技术在基础研究和应用方面取得重要进展,展现出在通信、雷达、计量等

Grow into a more wonderful you 988

将Apollo高精地图中的车道线叠加在多种导航地图上

本文介绍了将Apollo高精地图车道线叠加到普通导航地图的技术方案。高精地图具备厘米级车道精度和丰富的语义信息,叠加可实现可视化验证、调试分析和数据对比等功能。核心技术包括坐标系统转换(UTM/WGS84/BD09/GCJ02)和数据处理流程,通过Python脚本完成Apollo地图解析、坐标批量转换和多格式输出。文章详细提供了环境准备、工作目录创建和坐标转换脚本等操作步骤,实现了高精地图数据在OpenStreetMap、百度地图和高德地图上的可视化展示。

Hi20240217的博客 1333

synchronized底层原理(一)

synchronized是JVM内置锁,基于Monitor机制实现,依赖底层操作系统的互斥原语Mutex(互斥量),它是一个重量级锁,性能较低。当然,JVM内置锁在1.5之后版本做了重大的 优化,如锁粗化(Lock Coarsening)、锁消除(Lock Elimination)、轻量级锁(Lightweight Locking)、偏向锁(Biased Locking)、自适应自旋(Adaptive Spinning)等技术来减少锁操 作的开销,内置锁的并发性能已经基本与Lock持平。

qq_43456605的博客 1089

keil工程After Build/Rebuild添加带参.exe实现全流程(2):带参调用.exe的几种方法

keil工程After Build/Rebuild添加带参.exe实现全流程(2):带参调用.exe的几种方法。

kevin1499的博客 1617

synchronized底层实现原理

文章目录一、synchronized锁表现三种形势二、为什么说Synchronized是一个重量级锁三、Synchronized底层实现原理四、Synchronized锁存储位置五、Synchronized锁的升级过程 一、synchronized锁表现三种形势 Java中每个对象都可以作为锁。具体表现为以下3种方式: 对于普通方法,锁的是当前实例对象。 public class SynchronizedTest { public synchronized void test(String na

FighterLiu的专栏 1万+

核心组件大换血:Backbone与Neck魔改篇:YOLO26结合StarNet结构:2026星状网络在YOLO生态的即插即用实战

本文将介绍如何将StarNet作为Backbone替换YOLO26原生架构,以提升边缘设备上的目标检测性能。文章首先分析了YOLO26在特定场景下的精度瓶颈,指出其通用Backbone设计存在不足。随后深入解析StarNet的核心创新——星操作(Star Operation),这一低维计算却能获得高维特征表达的数学魔术,以及其极简的StarBlock模块设计。通过对比YOLO26原生架构的三大创新与痛点,作者提出两种替换策略:完整替换Backbone或局部替换+Neck联调。文中提供了StarNet核心代码

ZDQ58818的博客 289

2026年美赛数学建模竞赛 MCM B题:使用太空电梯系统建立月球殖民地 问题一 月球殖民地材料运输的三种场景建模 详细解题思路和代码

如果运输系统不能完美工作(例如,系绳摆动、火箭失败、电梯故障等),你的解决方案在多大程度上会发生变化?技术可行性:三种方案在技术上都是可行的,但挑战不同 经济性:混合方案在长期视角下最具成本效益 时间效率:并行运输可以显著缩短总建设时间环境影响:太空电梯的环境优势明显,混合方案可平衡需求风险分散:混合方案提供了天然的风险分散机制

YOLO 615

synchronized 的底层原理

synchronized 的底层原理

激流丶的博客 7442

汽车IVI中控开发入门及进阶(三):概述

开发板的作用当然是为了解决一些应用而设计的,主体是板,终极目的是应用,中间过程则是开发,是基于板的开发。可以和编译Linux内核一样,通过buildroot配置,menuconfig修改,编译出一个完整的可以直接烧写到芯片上运行的Linux系统软件(包含boot、kernel、rootfs以及rootfs中的各种库和应用程序)。所以这些实现都是建构在汽车中控开发板的解决方案上的,最核心的当然就是一颗中控主控芯片,这是一颗国产中控双核DA主控芯片,AECQ100认证的车规级芯片。Q:uboot的作用是什么?

码农17年的博客 1407

Java 程序员必须掌握的 10 个底层原理,你知道几个?

Java 程序的运行离不开 JVM(Java Virtual Machine)。JVM 的内存结构是理解 Java 底层原理的第一步。程序计数器(Program Counter Register):记录当前线程执行的字节码指令地址。Java 虚拟机栈(Java Virtual Machine Stacks):每个线程私有,用于存储局部变量、操作数栈、动态链接、方法出口等信息。本地方法栈(Native Method Stack):与 Java 虚拟机栈类似,但为 Native 方法服务。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

说一下synchronized底层实现原理?_死磕synchronized关键字底层原理

前言作为Java程序员,我们都知道在多线程的情况下,为了保证线程安全,经常会使用synchronized和Lock锁。Lock锁之前写过一篇《不得不学的AQS》,已经详细讲解过Lock锁的底层原理。这次我们讲一下日常开发中常用的关键字synchronized,想要用得好,底层原理必须要搞明白。synchronized是JDK自带的一个关键字,在JDK1.5之前是一个重量级锁,所以从性能上...

weixin_29725791的博客 2431

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

图文详解:synchronized关键字 及其底层原理

本文旨在分享如何解决线程安全问题,通过详细的解释和图示讲解了Java中的synchronized关键字的使用方法和具体细节,Java标准库中对于synchronized的使用。 线程安全是指在多线程环境下,对共享资源的访问不会导致数据不一致或出现意外结果的特性。在多线程程序中,多个线程可以同时访问和操作共享数据,如果没有适当的同步机制和保护措施,可能会导致数据竞争和不一致的问题。

luming的博客 2593

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

死磕synchronized底层原理

一起学习一下synchronized底层原理吧

yehongzhi1994的博客 490

Java并发编程实战深入剖析Synchronized与Lock的底层实现原理

公平锁在尝试获取锁时,会先检查AQS的等待队列中是否有比自己等待时间更长的线程(hasQueuedPredecessors()),如果有,则获取失败,直接排队,保证了“先来后到”的公平性。此时,Mark Word中存储的是指向一个操作系统层面的互斥量(mutex)的指针,等待锁的线程会进入阻塞状态,需要操作系统进行线程的调度和上下文切换,因此开销最大。总之,深入理解synchronized的锁升级和Lock的AQS框架,有助于开发者在不同场景下做出最合适的技术选型,并编写出高效、健壮的并发程序。

subscriberline的博客 767

Java并发编程之synchronized底层实现原理

一、为什么出现synchronized 对于程序员而言,不管是在平常的工作中还是面试中,都会经常用到或者被问到synchronized。在多线程并发编程中,synchronized早已是元老级的角色了,很多人都称其为重量级锁,但是随着Java SE 1.6对其进行各种优化之后,便显得不再是那么的重了。 也正是因为多线程并发的出现,便产生了线程安全这样的问题,对于线程安全的主要原因如下: ...

寒山道杳 5129

底层原理_死磕synchronized底层原理

文章已收录Github精选,欢迎Star:https://github.com/yehongzhi前言作为Java程序员,我们都知道在多线程的情况下,为了保证线程安全,经常会使用synchronized和Lock锁。Lock锁之前写过一篇《不得不学的AQS》,已经详细讲解过Lock锁的底层原理。这次我们讲一下日常开发中常用的关键字synchronized,想要用得好,底层原理必须要搞明白。sync...

weixin_30610431的博客 268

深度解析 Java synchronized 实现原理

本文详细介绍了Java中synchronized关键字的底层实现原理。synchronized通过对象头中的MarkWord实现锁机制,在JDK1.6后优化为锁升级机制(无锁→偏向锁→轻量级锁→重量级锁)。同步代码块使用monitorenter/monitorexit指令,而同步方法通过ACC_SYNCHRONIZED标志隐式实现。重量级锁依赖操作系统的MutexLock,性能较差;优化后的轻量级锁通过CAS和自旋减少开销。此外,JVM还支持锁消除和锁粗化等优化技术,使synchronized成为Java并

2401_87808951的博客 1335

深入synchronized底层原理

📝 个人主页:程序员阿红🔥 🎉 支持我:点赞👍收藏⭐️留言📝 📣 推荐文章:SSM整合🔥 🍗1. 引言 记得开始学习Java的时候,一遇到多线程情况就使用synchronized,相对于当时的我们来说synchronized是这么的神奇而又强大,那个时候我们赋予它一个名字“同步”,也成为了我们解决多线程情况的百试不爽的良药。 😈😈😈synchronized俗称:对象锁,专门用来锁对象的(这里不用过多关心对象的问题,反正你也不会有的😅)。 😺😺😺synchronized采用互斥的方式来保证同一时刻至多只有

程序员阿红的博客 1853
上一篇: 不允许还有Java程序员不了解BlockingQueue阻塞队列的实现原理
下一篇: Java程序员2022必看面试题(含答案)
油腻的程序猿啊
博客等级 码龄4年 113粉丝 289原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值