面试官问我synchronized的底层实现,我差点哭了

德邦2017秋招Java笔试题全解析:HashMap、JVM与线程池核心考点复盘 Java基础是校招笔试的基石,而真正的考察点往往藏在原理之中。从集合框架的HashMap底层结构到JVM内存区域与垃圾回收,再到并发编程的线程池参数与锁机制,每一道笔试题都在检验开发者对语言本质的理解。理解负载因子为何是0.75、对象创建的内存分配流程、volatile与synchronized的边界,才能应对千变万化的题目变体。这些知识不仅是应对笔试的钥匙,更是解决线上OOM、SQL注入、事务失效等真实工程问题的底层支撑。从物流订单状态机到日常CRUD,扎实的Java功底决定了系统的稳定性与可维护性。本文 阅读详情

每天叫醒你的不是闹钟,而是梦想

微信公众号 : Java患者

Synchronized

synchronized简介

synchronized是一个java的关键字,是java语言为了解决并发编程中存在的原子性、可见性和有序性的问题,提供了一系列跟并发处理有关的关键字,我们今天要来简单了解一下synchronized。

怎么锁?
package com.zero.day3;

/**
* @Description: synchronized
* @Author: Zero
* @Date: 2019/12/10
*/
public class SynchronizedDemo1 {




    // 同步方法
    public synchronized void wc1 () {
        System.out.println("我在上厕所1");
    }


    // 同步方法 (静态)
    public static void wc2 () {
        synchronized (SynchronizedDemo1.class) {
            System.out.println("我在上厕所2");
        }
    }


    // 同步代码块
    public void wc3 () {
        synchronized (this) {
            System.out.println("我在上厕所3");
        }
    }

}

上面三个简单的方法中都添加了Synchronized关键字,也就是在同一时间,每个方法只能被单个线程访问,一个厕所同一时间只有有一个人在用。

● 普通同步方法时:锁是当前实例对象
● 静态同步方法时:锁是当前类的class对象(因为静态方法在对象之前运行,运行静态方法的 时候可能都没有对象,所以是当前类的class对象)
● 同步方法块:锁是括号里面的对象

synchronized 实现原理

我们现在对上面的方法进行反编译操作

LINENUMBER 8 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
    RETURN
   L1
    LOCALVARIABLE this Lcom/zero/day3/SynchronizedDemo1; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 0x21
  public synchronized wc1()V
   L0
    LINENUMBER 15 L0
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    LDC "\u6211\u5728\u4e0a\u5395\u62401"
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
   L1
    LINENUMBER 16 L1
    RETURN
   L2
    LOCALVARIABLE this Lcom/zero/day3/SynchronizedDemo1; L0 L2 0
    MAXSTACK = 2
    MAXLOCALS = 1

  // access flags 0x9
  public static wc2()V
    TRYCATCHBLOCK L0 L1 L2 null
    TRYCATCHBLOCK L2 L3 L2 null
   L4
    LINENUMBER 21 L4
    LDC Lcom/zero/day3/SynchronizedDemo1;.class
    DUP
    ASTORE 0
    MONITORENTER
   L0
    LINENUMBER 22 L0
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    LDC "\u6211\u5728\u4e0a\u5395\u62402"
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
   L5
    LINENUMBER 23 L5
    ALOAD 0
    MONITOREXIT
   L1
    GOTO L6
   L2
   FRAME FULL [java/lang/Object] [java/lang/Throwable]
    ASTORE 1
    ALOAD 0
    MONITOREXIT
   L3
    ALOAD 1
    ATHROW
   L6
    LINENUMBER 24 L6
   FRAME CHOP 1
    RETURN
    MAXSTACK = 2
    MAXLOCALS = 2

  // access flags 0x1
  public wc3()V
    TRYCATCHBLOCK L0 L1 L2 null
    TRYCATCHBLOCK L2 L3 L2 null
   L4
    LINENUMBER 29 L4
    ALOAD 0
    DUP
    ASTORE 1
    MONITORENTER
   L0
    LINENUMBER 30 L0
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    LDC "\u6211\u5728\u4e0a\u5395\u62403"
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
   L5
    LINENUMBER 31 L5
    ALOAD 1
    MONITOREXIT
   L1
    GOTO L6
   L2
   FRAME FULL [com/zero/day3/SynchronizedDemo1 java/lang/Object] [java/lang/Throwable]
    ASTORE 2
    ALOAD 1
    MONITOREXIT
   L3
    ALOAD 2
    ATHROW
   L6
    LINENUMBER 32 L6
   FRAME CHOP 1
    RETURN
   L7
    LOCALVARIABLE this Lcom/zero/day3/SynchronizedDemo1; L4 L7 0
    MAXSTACK = 2
    MAXLOCALS = 3
}

我们仔细找找其实可以找到MONITORENTER跟MONITOREXIT这两个单词,接下来,我就用比较简单粗暴的语言来给大家随便说说这个过程。

       假如这个时候呢有三个线程Thread1,Thread2, Thread3都同时来调用一个方法,那么代码肯定是共享的啦,那么当这个方法function没有加锁的时候,Thread1来执行这个代码,执行到一半Thread2也可以来执行,Thread3当然也可以执行。

        当这个方法function加了锁之后就不一样了,这代码编译就会产生这两个指令,当Thread1来抢到CPU的执行权之后就来执行这个方法了啊,碰到这个MONITORENTER的时候,这就厉害了啊!其他的线程都给调用了wait方法,大家都知道当线程调用了wait方法之后,就会进入等待状态,谁都救不了它们,这个时候Thread1就自己大摇大摆地执行完了这个加锁的方法,自然就有了MONITOREXIT指令,这个时候线程还在等待?怎么办,当线程处于wait的时候我们都知道会调用notifyAll方法去唤醒所有的其他线程,这个时候所有的线程就苏醒了继续执行。

专注分享Java技术,跟我一起学习吧

长按识别二维码关注

腾讯四大方向面经汇总:前端、Java、C++、Go全解析 技术面试的底层逻辑,往往藏在各语言、框架的表象之下。无论是浏览器渲染机制、JVM内存模型、C++的RAII与移动语义,还是Go的GMP并发调度,大厂面试官真正考察的都是候选人“理解原理并落地决策”的能力。并发编程、性能优化、容器与数据结构这些高频考点,在不同技术栈中呈现出共通的考察维度——从基础八股到项目深挖,从手写代码到方案选型,每轮面试都在验证你能否在复杂工程中做出正确取舍。本文基于真实面试经历,完整复盘腾讯前端、Java、C++、Go四个方向的核心题目、追问链与答题思路,并横向对比各方向考察重点,提炼 阅读详情

相关推荐

UE5垃圾回收优化实战:定位GC卡顿与内存泄漏

垃圾回收(GC)是Unreal Engine 5中保障UObject内存安全的核心机制,其基于引用图的标记-清除原理决定了性能高度依赖引用结构合理性。当GC频繁触发或单次耗时突增,往往映射出蓝图强引用冗余、C++根对象管理失控或资源生命周期设计缺陷等底层问题。技术价值在于降低主线程阻塞、稳定60帧体验、抑制内存异常增长;典型应用场景包括关卡切换卡顿、UI打开后持续GC、打包后内存不释放等。本文聚焦UE5特有的Full GC模式、UObject生命周期约束及GC触发时机不可见性,提供从蓝图变量规范、TSoft

weixin_31995251的博客 362

面试回答synchronized底层实现原理

synchronized底层实现原理 这就是面试标准回答,我以前面试时,求的就是这种博客,我不需要你给我深入解释其所有原理,我只想要知道在面试被问时,该怎么回答,难道你指望我个小白去研究底层吗? synchronized是JVM实现的一种互斥同步访问方式,底层是基于每个对象的监视器(monitor)来实现的。被synchronized修饰的代码,在被编译器编译后在被修饰的代码前后加上了一组字节指令。 在代码开始加入了monitorenter,在代码后面加入了monitorexit,这两个字节码指令配合完

yuanchangliang的博客 1302

电力抄表协议DL/T645和698.45到底有啥区别?一张图帮你选对协议

本文深入对比了电力抄表协议DL/T645和DL/T698.45的技术差异,从协议架构、报文结构、功能覆盖到实施成本进行全面分析。通过实际案例和数据,揭示698.45协议在通信效率、业务扩展性和长期成本上的优势,并提供清晰的选型决策流程图,帮助工程师根据具体需求选择最适合的电力抄表协议。

weixin_38168696的博客 401

死磕Synchronized底层实现--概论

关于synchronized的底层实现,网上有很多文章了。但是很多文章要么作者根本没看代码,仅仅是根据网上其他文章总结、照搬而成,难免有些错误;要么很多点都是一笔带过,对于为什么这样实现没有一个说法,让像我这样的读者意犹未尽。 本系列文章将对HotSpot的synchronized锁实现进行全面分析,内容包括偏向锁、轻量级锁、重量级锁的加锁、解锁、锁升级流程的原理及源码分析,希望给在研究synch...

weixin_34235135的博客 881

在银河麒麟V10上部署Atlas 300i Duo:从固件到驱动的一站式踩坑笔记

日期:2025-09-09关键词:鲲鹏920、Atlas 300i Duo、银河麒麟V10、NPU、驱动、固件。

weixin_41544125的博客 2806

STM32F103C8T6的PC13-15引脚配置避坑指南:为什么你的IO口不工作?

本文详细解析了STM32F103C8T6的PC13-15引脚作为普通IO口不工作的原因及解决方案。这三个引脚默认关联侵入检测和低速外部时钟等特殊功能,需先禁用TAMPER和LSE,并开启AFIO时钟,才能正确配置为普通GPIO。文章提供了标准外设库和HAL库的配置步骤、常见问题排查方法及硬件设计注意事项。

weixin_29169899的博客 521

一个synchronized跟面试官扯了半个小时

这是《安琪拉与面试官二三事》系列文章的第二篇 —《钟馗面试官的Synchronized 钩子》。 历史文章(持续更新中): 《一个HashMap跟面试官扯了半个小时》 前言 ​ 话说上回HashMap跟面试官扯了半个小时之后,二面迎来了没有削弱前的钟馗,法师的钩子让安琪拉有点绝望。钟馗穿着有些微微泛黄的格子道袍,站在安琪拉对面,开始发难,其中让安琪拉印象非常深刻的是法师的sync...

安琪拉的博客 1万+

MicroCap声学仿真介绍(六)-入耳式耳机仿真

从上图可以看出,后腔开了泄声孔后,振膜的最大位移从4.8um提升到了10um,振膜位移增加了一倍。在实际应用中,一般耳机的前腔和后腔都需要开泄声孔,开孔的大小和调音网布的阻尼需要根据客户的要求以及仿真的结果进行权衡选择。接着在主界面放置电阻、电感、电容,电阻值为Rms,电感值为Mms,电容值为Cms,如下图。假设后腔泄声孔的直径为1.2mm,宽度为0.3mm,对应调音网的阻抗为5.5e8欧姆。假设前腔泄声孔的直径为1.2mm,宽度为0.3mm,对应调音网的阻抗为5.5e8欧姆。

山无忧的博客 1797

Java synchronized 底层实现,原理,面试题总结

全面介绍Java关键词synchronized: 1. 深入理解synchronized关键词,介绍其发展历程,底层实现。 2. 介绍synchronized锁的范围,升级、降级过程。 3. 介绍synchronized关联关键词wait,notify, notifyAll。 4. synchronized相关联的常见面试题。

sweetyi的专栏 1815

用Verilog搭建PCIe控制器核心模块

PCIe控制器是硬件设计的核心模块,负责实现设备与主机之间的高速通信。本文将以Verilog语言为例,分步骤讲解如何从零构建一个简化的PCIe控制器核心模块,涵盖事务层(TLP)生成、数据链路层(DLLP)处理和物理层(PHY)接口适配。目标是为嵌入式开发者、FPGA工程师提供一个可扩展的硬件设计框架。​。

xiaoheshang_123的博客 279

Vue3 + 高德地图实现车辆电子围栏监控与报警

通过本文的实现,我们完成了一个通用的车辆电子围栏监控功能:支持多种围栏类型。支持进入/离开/双向报警。使用缓存机制避免重复告警。可与Vue3 + 高德地图无缝集成。在实际项目中,可以结合WebSocket 实时定位,实现车辆的实时监控 + 围栏告警系统🚀。

专注于前端开发与实战技巧,记录从零到一的学习与项目经验。分享 Vue3 / JavaScript / TypeScript / Flutter /Uniapp等前端技术,以及 性能优化、工程化、最佳实践。 1033

面试必备:synchronized的底层原理?

最近更新的XX必备系列适合直接背答案,不深究,不喜勿喷。 你能说简单说一下synchronize吗? 可别真简单一句话就说完了呀~ 参考回答: synchronize是java中的关键字,可以用来修饰实例方法、静态方法、还有代码块;主要有三种作用:可以确保原子性、可见性、有序性,原子性就是能够保证同一时刻有且只有一个线程在操作共享数据,其他线程必须等该线程处理完数据后才能进行;...

niceyoo的博客 958

基于 高斯过程回归(Gaussian Process Regression, GPR) 的 时间序列区间预测 的 MATLAB 示例代码

基于 高斯过程回归(Gaussian Process Regression, GPR) 的 时间序列区间预测 的 MATLAB 示例代码

算法如诗的博客 153

面试官问我“synchronized 是怎么实现的?”,我从偏向锁聊到锁膨胀

概念说明Java 内置锁,用于多线程同步加锁操作解锁操作Mark WordJVM对象头的锁标志字段偏向锁优化无竞争场景轻量级锁CAS + 自旋重量级锁操作系统互斥锁关注「小奇 Java 面试」,我不仅懂锁,还能帮你把线程安全锁成快乐单身狗。

真正的大师永远怀着一颗学徒的心 495

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

围绕一个 volatile 关键字居然可以问出来 16 个问题,差点没崩住

对于 Java 每次面试就会想到多线程,多线程问题基本跑不了要问一下 volalite 关键字,可是我万万没想到居然一个 volatile 关键字可以连续问题出来 16 个问题!看下你能回答出来几个? volatile 关键字是什么意思? 你了解到的什么地方使用了 volatile 关键字?解决了什么问题? volatile 和 JMM 有什么关系? 什么是指令重排?volatile 和指令重排有什么关系? 什么是内存屏障?volatile 和内存屏障有什么关系? 什么是 happens.

Java架构师联盟 362

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Java大厂面试实录:面试官与水货程序员谢飞机的爆笑对决

通过搞笑程序员谢飞机的面试故事,深入讲解Java核心、并发、Spring、Redis等大厂常考技术点,寓教于乐,小白也能轻松掌握。

优快云LD的博客 1339

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

乐视Java实习笔试题解析:HashMap、线程池与并发底层考点全梳理

在Java后端开发中,集合框架与并发编程是衡量工程师基础能力的重要标尺。HashMap作为最常用的数据结构,其底层涉及哈希冲突、树化阈值与扩容机制,理解JDK 1.7与1.8的差异,能帮助开发者规避多线程环境下的隐患。线程池则是并发场景下的核心工具,核心线程数、任务队列与拒绝策略的配合,决定了系统在高负载下的稳定性。volatile关键字通过内存屏障保证可见性与有序性,是双重检测锁单例的关键。这些知识不仅在面试中高频出现,更直接应用于缓存设计、任务调度、接口性能优化等真实工程场景。本文以乐视2017年Jav

weixin_34387468的博客 480

互联网大厂Java面试现场:面试官与水货程序员谢飞机的3轮灵魂对话(附详细答案)

*DDD (Domain Driven Design) 领域驱动设计核心概念:│ 战略设计 ││ 限界上下文 (Bounded Context) ││ ├── 订单上下文 ││ ├── 支付上下文 ││ └── 库存上下文 ││ ││ 上下文映射 (Context Mapping) ││ ├── 客户-供应商 ││ ├── 防腐层 (Anti-Corruption Layer) ││ └── 开放主机服务 ││ 战术设计 ││ 聚合根 (Aggregate Root) │。

2301_80211654的博客 408

Java面试核心:HashMap、多线程与Spring循环依赖解析

在Java开发中,数据结构与多线程是核心技术基础。HashMap作为经典数据结构,其实现原理涉及数组+链表+红黑树的组合,以及哈希计算、扩容机制等关键设计。多线程编程中,volatile和synchronized的区别不仅涉及可见性与原子性,更深层次的是JMM内存模型与CPU缓存一致性协议。Spring框架通过三级缓存解决循环依赖问题,体现了控制反转的设计思想。掌握这些核心原理,不仅能提升面试表现,更能在实际开发中设计出高性能、高可用的系统。本文通过真实面试案例,深入剖析这些技术要点的底层实现与工程实践。

weixin_34326558的博客 436

美团Java一面复盘:八股文、代码输出与算法题全解析

Java基础与JVM原理是后端开发的核心能力,尤其HashMap的底层实现、volatile的内存语义及synchronized的锁升级机制,直接关系到并发场景下的性能与稳定性。在技术招聘中,面试官常通过原理追问、代码输出判断和算法实战来评估候选人的工程素养。美团一面正是这种考察方式的典型代表,从自增运算的求值顺序到字符串常量池,再到双指针优化,每一环节都在检验知识的内化程度。本文完整复盘了这场面试的三大板块,并给出答题思路与补强建议,帮助你提前熟悉大厂面试节奏,构建更扎实的复习体系。

weixin_33910759的博客 424

携程Java三面实录:从HashMap到系统设计,面试官到底在考什么

Java面试中,HashMap、JVM、并发锁机制等基础概念常常被连环追问,这背后真正考察的是对技术原理的深度理解,而不只是背诵结论。掌握源码级原理不仅能从容应对追问,更能支撑工程中的技术选型与性能优化。在实际业务场景里,高并发下单、分布式锁、缓存一致性等问题,都要求将零散知识点串联成自洽的知识体系。本文以携程三面实录为主线,还原从集合源码、JVM内存排查、线程池调优,到项目深挖、系统设计、主管面决策判断的完整考察路径,并结合开发环境常见问题,帮助准备Java中高级岗位的读者理解面试官真正的筛选逻辑,建立从

weixin_30239339的博客 481

蚂蚁金服与阿里中间件面试实战:Java工程师如何备战分布式与底层原理

Java工程师在准备大型互联网公司面试时,通常从Java基础、并发编程、JVM调优等知识点入手,但真正决定面试深度的往往是分布式系统设计与中间件底层原理的理解。无论是业务研发岗还是基础技术岗,面试官都倾向于通过真实场景考察候选人对分布式事务、消息队列、RPC框架、微服务治理等核心技术的掌握程度。比如消息队列如何保证不丢不重、RPC框架的SPI机制如何实现、分布式协调服务如何选主,这些底层原理不仅体现技术功底,更决定了系统高可用与高性能的落地能力。在实际面试中,候选人需要将理论知识与工程实践结合,清晰阐述技术

weixin_34082789的博客 449

Java集合框架与多线程面试常见误区解析

Java集合框架是Java编程中的核心组件,涉及数据结构的高效存储与访问。其底层原理包括数组动态扩容、哈希冲突解决等关键技术,直接影响系统性能与线程安全。在多线程环境下,正确使用ConcurrentHashMap等并发容器能有效避免数据竞争,而理解volatile关键字的内存语义则是保证可见性的基础。实际开发中,电商秒杀等高并发场景特别依赖这些技术的合理运用。本文通过典型面试案例,揭示开发者常混淆的HashMap线程安全误区,以及LinkedList与ArrayList的性能差异问题,帮助读者掌握集合框架的

weixin_29290947的博客 295

一个由String、StringBuilder、StringBuffer 引发的面试惨案

前言: String,StringBuilder,StringBuffer的区别是啥?这个面试题估计每个程序员都应该碰到过吧。依稀记得第一次面试的时候,面试官问我这个问题时,心想着这不是很简单吗。深入了解这个问题后,发现这里面并不简单,面试官的套路还是深啊! 面试官:你好,欢迎来面试,介绍一下自己吧。 你好,我是**, 来自 **,毕业于拖拉机学院,目前工作了2年,在 ** 公司做了一年的开发,做过的项目有。。。布拉布拉 然后双方对项目进行深入的讨论。。。 然后进行基础问答环节 下面

Javaesandyou的博客 507

快手后端Java面试全攻略:从HashMap到分布式系统设计

Java后端开发是当前软件工程领域的热门方向,尤其在互联网大厂的招聘中,对并发编程、JVM底层、数据库与缓存等核心知识的要求极为严格。面试官往往不满足于你背出结论,而是通过连环追问检验你对原理的理解深度。比如从HashMap为何线程不安全,到ConcurrentHashMap如何通过CAS与synchronized桶锁实现高效并发;从synchronized的锁升级路径,到volatile的可见性与原子性边界;再到JVM内存区域与OOM实战排查、Spring Bean生命周期与事务失效场景、MySQL索引与

weixin_29587015的博客 338

三面百度被吊打,凭借这份阿里大牛整理的资料,终拿下字节offer

线程安全是什么?volatile 和 synchorized 的区别假如有一个类 A 和一个 类 B,这两个类都有一个变量和一个自增操作,A 类的变量用 volatile 修饰,B 类没有用,B 类的自增操作用 synchorized 修饰,他们都是线程安全的吗,如果都是,那为什么要用 synchorized ,volatile 不是更轻量吗,synchorized 有什么作用。

2401_83977357的博客 468
上一篇: synchronized入门到源码
下一篇: 这一行代码到底做了什么~终篇
新时代Java农民工
博客等级 码龄7年 16粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值