Synchronized相关的面试题

本文详细解析了Java中Synchronized关键字的底层实现,包括锁升级的概念,以及偏向锁、轻量级锁和重量级锁的工作原理。通过对比不同锁的区别和联系,帮助读者深入理解Java并发编程中的锁机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.Synchronized关键字的底层实现是什么?

2.什么是Synchronized的锁升级?

3.什么是偏向锁,轻量级锁,重量级锁呢?

 4.各种锁之间的区别和联系?     


1.Synchronized关键字的底层实现是什么?

        从各个层面分析

        1.java代码: synchronized

        2.字节码的层面: monitorenter,moniterexit

        3.jvm 执行过程中会自动升级 无锁--》偏向锁---》轻量级锁---》重量级锁

        4.lock comxchg

2.什么是Synchronized的锁升级?

        1.6之前,synchronized是一个重量级锁,1.6之后,jvm对synchronized进行了锁升级,出现了锁的状态从无锁-->偏向锁-->轻量级锁--->重量级锁这个过程。

3.什么是偏向锁,轻量级锁,重量级锁呢?

        偏向锁是第一次执行synchronized的代码,会把锁的线程id放在mark word里,下一次如果是同一个线程进来,只需要先判断,mark word中的线程id是不是当前的线程id,如果是当前的线程id,直接执行代码块中的代码。

        轻量级锁:当前锁状态是偏向锁,被另外的线程访问,此时偏向锁就会升级为轻量级锁,其他线程会以自旋的方式获得锁,不会阻塞。mark word存储胡中指向栈中锁记录的指针。

        重量级锁:如果锁的竞争激烈,达到最大自旋次数的线程,会将轻量级锁升级为重量级锁,等待的锁会直接挂起。markword中指向互斥量的指针。

 4.各种锁之间的区别和联系?     

        偏向锁: Mark Word 里存储锁偏向的线程 ID 标志位 01

        轻量级锁:指向栈中锁记录的指针 00 锁竞争失败会自旋

        重量级锁:指向互斥量的指针 11 锁竞争失败会阻塞

 一图胜千言

        

参考

1.https://www.jianshu.com/p/eac466494477-----------cas 原理

2.https://www.jianshu.com/p/da9d051dcc3d----aqs

3.https://blog.csdn.net/u012102536/article/details/103070769--- aqs源码分析

4.https://www.cnblogs.com/jxxblogs/p/11751944.html-------线程池的状态

5.https://www.jianshu.com/p/389b58856894----- java 线程池源码分析

6.https://www.jianshu.com/p/117571856b28---- java 线程池的实现源码分析

7.https://www.jianshu.com/p/063ebba64ec4---- java 线程池原理与Executor框架

8.https://www.jianshu.com/p/36eedeb3f912-----偏向锁,轻量级锁,重量级锁详解

9.https://www.bilibili.com/video/BV1s741127Gn?from=search&seid=14128259413075469454 ------ 偏向锁,轻量级锁,重量级锁视频

10.https://blog.csdn.net/lengxiao1993/article/details/81568130---- 偏向锁,轻量级锁,重量级锁的详解

11.https://segmentfault.com/a/1190000022904663

<think>好的,我现在需要处理用户关于Javasynchronized关键字的面试题相关知识点的请求。首先,用户之前的问题是关于线程池的面试题,现在转向了synchronized关键字。我需要结合用户提供的引用内容来组织答案,同时确保符合之前的系统级指令,比如正确使用LaTeX格式、中文回答、生成相关问题等。 首先,用户提到了五个引用,其中详细说明了synchronized的实现原理、锁类型、优化、与ReentrantLock的比较以及使用场景和限制。需要将这些信息整合成一个结构清晰的回答,涵盖用户提到的关键字、用法、场景、锁机制等方面。 用户希望面试题相关知识点分开,可能需要先总结知识点,然后列出常见面试题。根据引用内容,synchronized的锁类型包括悲观锁、非公平锁、可重入锁、独占锁。JDK1.6的优化如锁升级机制(偏向锁、轻量级锁、重量级锁)需要详细说明。同时要对比synchronized和ReentrantLock的区别,涉及JVM层面与API层面、功能差异等。 在回答中需要确保正确引用标记,例如引用[^2]提到synchronized实现的锁类型,引用[^4]提到JDK1.6的优化。同时要注意用户之前的回答结构,如线程池部分有心参、工作流程等,这里可能需要类似的结构,比如锁机制、使用场景、优化等。 需要检查是否有矛盾或重复的信息,例如引用[5]提到synchronized的限制中“不是递归锁”,但引用[2]和[3]指出synchronized是可重入锁,这里可能存在误解,需要纠正。可重入锁允许同一线程多次获取锁,而递归锁通常指同一方法内的重入,因此需要明确说明synchronized确实支持可重入。 此外,用户要求生成相关问题,需要基于知识点设计相关问题,如锁优化、对比其他锁机制、使用注意事项等。要确保问题覆盖主要知识点,帮助用户全面准备面试。 最后,保持回答结构清晰,分点说明,使用LaTeX格式行内公式(如线程设置中的$N_{cpu}$),并正确使用引用标记。确保所有技术术语准确,符合Java官方文档和常见面试题的标准回答。</think>### Synchronized关键字面试知识点总结 --- #### 一、锁类型与特性(参考[^2][^3][^5]) 1. **锁类型** - **悲观锁**:默认线程访问共享资源时会冲突,直接加锁 - **非公平锁**:线程获取锁的顺序不按阻塞顺序,允许插队 - **可重入锁**:同一线程可多次获取同一把锁,计器自增到0才释放 - **独占锁**:仅允许单个线程持有锁 2. **特性对比** | 特性 | synchronized | ReentrantLock | |---|---|---| | 实现层级 | JVM层面(Monitor机制) | API层面(Lock接口) | | 锁公平性 | 仅非公平锁 | 支持公平/非公平锁 | | 可中断 | 不支持 | 支持`lockInterruptibly()` | | 超时机制 | 不支持 | 支持`tryLock(timeout)` | | 条件变量 | 单条件 | 多条件(`Condition`对象) | --- #### 二、底层原理与优化(参考[^1][^4][^5]) 1. **Monitor机制** - 通过`monitorenter`和`monitorexit`字节码指令实现 - 对象头中的Mark Word存储锁状态(无锁、偏向锁、轻量级锁、重量级锁) 2. **JDK1.6锁升级流程** ``` 无锁 → 偏向锁(单线程访问) ↓ 竞争加剧 轻量级锁(CAS自旋) ↓ 自旋失败 重量级锁(OS互斥量) ``` - **偏向锁**:消除无竞争时的同步开销 - **轻量级锁**:通过自旋避免线程阻塞 - **适应性自旋**:根据历史自旋时间动态调整 --- #### 三、使用场景与限制(参考[^5]) 1. **适用场景** - 保护共享变量(如计器`private int count`) - 同步实例方法(锁对象为当前实例) - 同步静态方法(锁对象为Class对象) - 代码块同步(指定锁对象) 2. **代码示例** ```java // 同步代码块 public void increment() { synchronized(this) { count++; } } // 同步静态方法 public static synchronized void log() { System.out.println("Thread-safe logging"); } ``` 3. **性能限制** - 线程阻塞/唤醒涉及内态切换(约1μs) - 高并发场景下可能触发重量级锁(竞争激烈时性能下降) --- #### 四、高频面试题示例 1. **synchronized与ReentrantLock的区别?** - 底层实现:JVM Monitor vs API层面 - 功能扩展:ReentrantLock支持公平锁、条件变量、锁中断 - 锁释放方式:自动释放 vs 必须`unlock()` 2. **JDK1.6锁优化具体如何实现?** - 偏向锁通过记录线程ID减少CAS操作 - 轻量级锁通过栈帧中的Lock Record实现CAS自旋 - 适应性自旋根据前一次自旋时间动态调整阈值 3. **synchronized能否实现公平锁?为什么?** - 不能,因为底层非公平抢占机制(参考Monitor的EntryList设计) 4. **如何避免死锁?** - 按固定顺序获取锁 - 使用`tryLock()`设置超时 - 避免嵌套锁(如`synchronized`方法调用其他`synchronized`方法) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值