java中的锁面试题

第 5-7 课:Java 中的各种锁和 CAS + 面试题 如果说快速理解多线程有什么捷径的话,那本文介绍的各种锁无疑是其中之一,它不但为我们开发多线程程序提供理论支持,还是面试中经常被问到的核心面试题之一。因此下面就让我们一起深入地学习一下这些锁吧。 乐观锁和悲观锁 悲观锁和乐观锁并不是某个具体的“锁”而是一种并发编程的基本概念。乐观锁和悲观锁最早出现在数据库的设计当中,后来逐渐被 Java 的并发包所引入。 悲观锁 悲观锁认为对于同一个数据的并发操作,... 阅读详情

1、多线程中 synchronized 锁升级的原理是什么?

synchronized 是JVM层面的锁,是 Java 关键字,通过 monitor 对象来完成,synchronized 的实现涉及到锁的升级,具体为无锁、偏向锁、自旋锁、重量级锁
synchronized 锁升级原理:在锁对象的对象头里面有一个 threadid 字段,在第一次访问的时候 threadid 为空,jvm 让其持有偏向锁,并将 threadid 设置为其线程 id,再次进入的时候会先判断 threadid 是否与其线程 id 一致,如果一致则可以直接使用此对象,如果不一致,则升级偏向锁为轻量级锁(只要有另一个竞争线程就升级),通过自旋循环一定次数来获取锁,执行一定次数之后,如果还没有正常获取到要使用的对象,此时就会把锁从轻量级升级为重量级锁,此过程就构成了 synchronized 锁的升级。

锁的升级的目的:锁升级是为了减低了锁带来的性能消耗。在 Java 6 之后优化 synchronized 的实现方式,使用了偏向锁升级为轻量级锁再升级到重量级锁的方式,从而减低了锁带来的性能消耗。

升级成重量锁条件

老版本:2个条件

  • 第一个条件,自旋次数超过10次时直接升级为重量级,就是转圈赚了10次后直接升级重量级锁,jvm有个参数 preSpinLock,默认是10次,可以自己设置
  • 第二个条件,如果自旋线程的数量超过了cpu的二分之一,也会直接升级为重量级锁;比如你的cpu锁核数是8个,但是有5个线程在那自旋等着占锁使用,8的二分之一是4,5个线程明显已经超过了4,所以这时候直接升级为重量级锁;

新版本:Adaptive CAS (自适应自旋),让hotSpot自己决定自旋几次在升级为重量级锁,就相当于自动化了;也就不用我们去管了。所以以后jvm调优就不需要调整自旋次数的参数;因为内部情况怎样只有jvm自己知道;

2、Synchronized 与 ReentrantLock 的区别

1.1 底层实现的区别

  • synchronized 是JVM层面的锁,是 Java 关键字,通过 monitor 对象来完成,synchronized 的实现涉及到锁的升级,具体为无锁、偏向锁、自旋锁、重量级锁
  • 而 ReentrantLock 是由 java api 去实现的。ReentrantLock 实现则是通过利用CAS自旋机制保证线程操作的原子性和volatile保证数据可见性以实现锁的功能。

1.2 是否可手动释放

  • synchronized 不需要用户去手动释放锁,synchronized 代码执行完后系统会自动让线程释放对锁的占用。
  • ReentrantLock 则需要用户去手动释放锁,如果没有手动释放锁,就可能导致死锁现象。一般通过 lock() 和 unlock() 方法配合 try / finally 语句块来完成,使用释放更加灵活。

1.3 是否可中断

  • synchronized 是不可中断类型的锁,除非加锁的代码中出现异常或正常执行完成。
  • ReentrantLock 则可以中断,可通过 trylock(long timeout,TimeUnit unit) 设置超时方法;或者将 lockInterruptibly() 放到代码块中,调用 interrupt 方法进行中断。

1.4 是否公平锁

  • synchronized 为非公平锁。
  • ReentrantLock 则即可以选公平锁也可以选非公平锁,通过构造方法 new ReentrantLock 时传入 boolean 值进行选择,为空默认 false 非公平锁,true 为公平锁。

1.5 锁是否可绑定条件 Condition

  • synchronized 不能绑定。
  • ReentrantLock 通过绑定 Condition 结合 await() / singal() 方法实现线程的精确唤醒,而不是像 synchronized 通过 Object 类的 wait() / notify() / notifyAll() 方法要么随机唤醒一个线程要么唤醒全部线程。

1.6 锁的对象

  • synchronzied 锁的是对象,锁是保存在对象头里面的,根据对象头数据来标识是否有线程获得锁 / 争抢锁。
  • ReentrantLock 锁的是线程,根据进入的线程和 int 类型的 state 标识锁的获得 / 争抢。

原文链接:https://blog.youkuaiyun.com/liuwg1226/article/details/120164119

3、synchronized和lock有什么区别

  • 1:synchronized 是JVM层面的锁,是 Java 关键字,通过 monitor 对象来完成,synchronized 的实现涉及到锁的升级,具体为无锁、偏向锁、自旋锁、重量级锁,而Lock是java.util.concurrent.Locks 包下的一个接口;
  • 2:Synchronized 使用过后,会自动释放锁,而Lock需要手动上锁、手动释放锁。(在 finally 块中)
  • 3:synchronized 关键字不能响应中断;Lock可以响应中断、可定时
  • 4:synchronized关键字是非公平锁,即,不能保证等待锁的那些线程们的顺序,而Lock的子类ReentrantLock默认是非公平锁,但是可通过一个布尔参数的构造方法实例化出一个公平锁;
  • 5:synchronized无法判断,是否已经获取到锁,而Lock通过tryLock()方法可以判断,是否已获取到锁;
  • 6:Lock可以通过分别定义读写锁提高多个线程读操作的效率。
  • 7:二者的底层实现不一样:synchronized是同步阻塞,采用的是悲观并发策略;Lock是同步非阻塞,采用的是乐观并发策略(底层基于volatile关键字和CAS算法实现)

4、公平锁、非公平锁、可重入锁、独占锁

  • 公平锁是指在分配时候考虑线程排队等待的情况,优先将该锁分配给排队时间最长的线程
  • 非公平锁指在分配时候不考虑线程排队等待的情况,直接尝试获得锁,在获取不到锁时候再排队,到队尾等待
  • 可重入锁也叫递归锁,指在同一个线程中,在外层函数获得该锁之后,内层的递归函数依旧可以继续获取该锁
  • 独占锁指该锁在同一个时间只能被同一个线程获得,而获得锁的其他线程只能在同步队列中等待

5、Volatile如何保证可见性

Volatile有两个特性:

  • 一种是保证该变量对所有的线程可见
  • 一种是禁止指令重排,即Volatile变量不会被缓存在寄存器或是对其他处理器不可见的地方

volatile修饰的变量,JMM将在写操作后插入一个写屏障指令,在读操作前插入一个读屏障指令,这代表着:

  • 一旦对变量写入了新值,任何访问这个变量的线程都会得到新的值
  • 在写入前,也会保证所有之前发生的事情已经发生,并且更新过的数据值也是可见的。内存屏障会把之前的写入值都刷新到主内存

所以Volatile可以保证可见性

6、说说java内存模型

java内存模型(JMM)是线程间通信的控制机制.JMM定义了主内存和线程之间抽象关系。线程之间的共享变量存储在主内存中,每个线程都有一个私有的本地内存,本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。

7、死锁的发生原因和怎么避免

死锁,简单来说就是两个或者两个以上的线程在执行的过程中,争夺同一个共享资源造成的相互等待的现象。如果没有外部干预,线程会一直阻塞无法往下执行,这些一直处于相互等待资源的线程就称为死锁线程。

导致死锁的条件有四个,也就是这四个条件同时满足就会产生死锁。

  • 互斥条件,共享资源 X 和 Y 只能被一个线程占用;
  • 请求和保持条件,线程 T1 已经取得共享资源 X,在等待共享资源 Y 的时候,不释放共享资源 X;
  • 不可抢占条件,其他线程不能强行抢占线程 T1 占有的资源;
  • 循环等待条件,线程 T1 等待线程 T2 占有的资源,线程 T2 等待线程 T1 占有的资源,就是循环等待。

按照死锁发生的四个条件,只需要破坏其中的任何一个,就可以解决,但是,互斥条件是没办法破坏的,因为这是互斥锁的基本约束,其他三方条件都有办法来破坏:

1、设置超时时间,超时可以退出,防止死锁

2、降低锁的使用粒度,尽量不要几个功能用同一把锁

3、我们可以一次性申请所有的资源,这样就不存在等待了

8、CAS、CAS自旋等待、ABA问题

CAS指比较并交换,CAS算法CAS(V,E,N)包含三个参数,V表示要更新的变量 E 表示预期的值 N 表示 新值。当要更新的变量等于预期的值,才会把要更新的变量设置为新值,CAS操作采用了乐观锁的思想

CAS自旋等待:在原子包concurrent提供了一组原子类,这些原子类的基本特性是在多线程的环境下,在有多个线程同时执行这些类的实列包含的方法时候,会有排他性。其内部便是基于CAS算法实现的,即在某个线程进入方法中执行其中的指令时候,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完才由jvm从等待的队列中选择另外一个线程进入。

ABA问题:在需要取出内存中某时刻的数据,然后再下一个时候进行比较替换,如果在这个时间差内可能数据已经发生改变,可能导致ABA问题。即第1个线程从V取出A,这时第2个线程也从内存V中取出A,并将V位置的数据A先修改成B,接着又把数据修改成A ,第一个线程在进行CAS操作的时候发现V位置的数据是A,第一个线程操作成功。尽管第一个线程角度,CAS操作是成功,但实际上的数据发生了变化,某些情况下可能引起过程数据不一致的问题。可以通过版本号来解决这个问题

9、什么是AQS

AQS是一个抽象的队列同步器,通过维护一个共享的资源状态和一个先进先出的线程等待队列来实现一个多线程访问共享资源的同步框架

AQS为每个共享资源都设置了一个共享资源锁,线程在需要访问共享资源时首先需要获得共享资源锁,如果获取到了共享资源锁,既可以在当前线程使用该共享资源,如果获取不到,则将该线程放入等待队列中,等待下次调度

AQS定义了两种资源共享的方式,独占式和共享式

  • 独占式:只有一个线程可以执行,如ReentrantLock,原理是ReentrantLock中的state初始值为0表示无锁状态,在线程执行tryAcquire()获取该锁后state+1,这是该线程独占ReentrantLock锁,其他线程在通过tryAcquire()获得锁时候都会失败,直到该线程释放后state再次为0
  • 共享式多个线程可以同时执行,如countDownLatch等
Coding Plan:程序员真实工作的可执行编码决策框架 Coding Plan 是一种面向工程实践的编码决策方法论,它超越传统学习路径,聚焦于代码在真实业务系统中的上下文对齐、影响控制与可演进性保障。其核心在于将模糊的开发直觉转化为可度量、可验证、可协作的日常动作,涵盖目标对齐、上下文锁定、验证闭环、协作契约和演进预留五大锚点。结合2026年AI辅助编码新范式,它强调将大模型作为‘上下文翻译器’而非代码生成器,并通过分钟级工作块、技术债主动发行、可观测性前置等机制,显著提升交付确定性与系统长期健康度。本文详解该框架的底层逻辑与落地实践。 阅读详情

相关推荐

【Unity】YooAsset + HybridCLR热更

本文介绍了Unity游戏开发中的热更新技术方案,重点对比了资源热更和代码热更的主流工具。资源热更方面分析了Asset Bundle、Addressable和YooAsset的优缺点;代码热更部分比较了xLua、ILRuntime、InjectFix和HybridCLR的性能特点。文章详细演示了HybridCLR+YooAsset的实践方案,包括加载热更新程序集、反射调用热更代码、资源打包部署等完整流程。该方案通过原生运行时实现程序集级热更,具有极低性能损耗和全生命周期适用性,配合YooAsset简化了资源管

欢迎指错||纠正||建议||水评+点赞&&评论&&关注&&转发 2916

Lock和Synchronize区别详解

synchronized是Java中的一个关键字,当我们调用它时会从在虚拟机指令层面加锁,关键字为monitorenter和monitorexitLock是Java中的一个接口,它有许多的实现类来为它提供各种功能,加锁的关键代码为大体为Lock和unLock;synchronized可对实例方法、静态方法和代码块加锁,相对应的,加锁前需要获得实例对象的锁或类对象的锁或指定对象的锁。说到底就是要先获得对象的监视器(即对象的锁)然后才能够进行相关操作。

qq_43842093的博客 7700

界面上下固定_基于ANSYS的胶粘结构界面开裂有限元计算

引言:目前工程上主要有螺栓,过盈,焊接和胶粘四种常用的连接方式,本文基于ANSYS Workbench环境,引入内聚力模型来实现对胶粘结构界面开裂失效的计算,文中的界面失效参数为随意给定,不是工程实际测试数据,仅起到演示作用!1.问题的描述如图所示给出了胶粘结构的三维模型,该胶粘结构由上下钢板组成,中间通过胶粘接到一起。(胶不需要建模,其影响主要通过内聚力模型实现)上下板的材料为结构钢,...

weixin_29473667的博客 1万+

synchronized和Lock的区别是什么?

区别:1、lock是一个接口,而synchronized是java的一个关键字。2、synchronized在发生异常时会自动释放占有的锁,因此不会出现死锁;而lock发生异常时,不会主动释放占有的锁,必须手动来释放锁,可能引起死锁的发生。 在分布式开发中,锁是线程控制的重要途径。Java为此也提供了2种锁机制,synchronized和lock。 0、synchronized实现原理 Java中每一个对象都可以作为锁,这是synchronized实现同步的基础: 普通同步方法,锁是当前.

这个人很懒,什么都没有留下。 2万+

保姆级教程:用YOLOv8n模型在RKNN和Horizon平台完成目标检测(附C++部署代码与性能实测)

本文提供了一份详尽的YOLOv8n模型在RKNN和Horizon平台上的部署指南,涵盖环境配置、模型优化、跨平台适配及性能调优。通过实战案例和C++部署代码,帮助开发者在嵌入式设备上高效实现目标检测,显著提升推理性能。

weixin_42659194的博客 468

Selenium ChromeDriver反爬与性能优化实战指南

ChromeDriver作为Selenium的核心驱动,本质是浏览器自动化执行引擎,其默认行为会暴露大量JS运行时指纹(如navigator.webdriver、window.chrome),极易被前端反爬系统识别;同时因进程管理粗放、渲染等待机制僵化,导致内存泄漏、僵尸进程和高并发下稳定性崩塌。本文围绕真实生产场景,系统解析浏览器指纹伪造原理、进程级资源管控策略、基于页面状态的智能等待范式,并提供Docker容器化、K8s弹性扩缩与Prometheus可观测性落地路径,助力开发者将ChromeDriver

weixin_29762151的博客 1259

synchronized和Lock有什么区别

java语言中提供了两种锁机制来实现对某个共享资源的同步:synchronized和Lock.其中synchronized使用Object对象本身的notify,wait和notifyAll来实现线程之间的调度.而Lock可以使用Condition进程线程之间的调度 ①用法不同 synchronized可以加在方法上,也可以加在特定的代码块中,括号中表示需要锁的对象 Lock需要显式地指定起...

不羁朔风的博客 1639

14、OpenClaw(龙虾助手)Skill 开发完整规范(2026最新版)

OpenClaw Skill 开发指南摘要: Skill 是 OpenClaw AI 助手的核心扩展机制,支持声明式(SKILL.md)和原生代码(JS/TS/Python)两种开发模式。声明式 Skill 通过 Markdown 定义触发条件和执行流程,适合简单业务;原生代码 Skill 提供完整编程能力,适合复杂场景。开发需遵循标准化项目结构,包含 SKILL.md(元数据)、manifest.json(权限声明)等文件,并严格处理错误和多系统适配。新版要求原生 Skill 必须声明文件、网络等权限,确

欢迎光临~知1而N的博客 1239

Synchronized和Lock的区别

一、原始构成 synchronized是关键字属于JVM层面 monitorenter(底层是通过monitor对象来完成,其实wait/notify等方法也依赖于monitor对象,只有在同步块或方法中才能调wait/notify等方法) monitorexit lock是具体类(java.util.concurrent.locks.Lock)是api层面的锁 二、使用方法 synchronized不需要用户去手动释放锁,当synchronized代码执行完后,系统会自动让线程释放对锁的占

Jak的博客 338

华为od 面试八股文_Spring_03_含答案

控制反转IOC是一个很大的概念,可以用不同的方式来实现。其主要实现方式有两种:依赖注入和依赖查找依赖注入;

MISAYAONE的博客 2341

零基础入门simulink仿真建模--通信领域的编码与纠错技术--基于Simulink的CRC校验算法仿真建模示例

CRC是一种广泛应用于数字网络和存储设备中的错误检测码。它的基本原理是利用除法运算来产生固定长度的校验位,这些校验位被附加到原始数据之后发送出去。接收端收到数据后,重新计算校验值并与接收到的校验值进行比较,如果两者相同,则认为数据没有错误;否则,表示数据可能已被损坏。发送端:随机比特生成模块 + CRC生成模块。信道:模拟数据传输过程中的潜在错误(可选)。接收端:CRC校验模块 + 错误指示模块。通过本指南,我们介绍了如何基于Simulink搭建一个简单的CRC校验系统模型,并进行了仿真分析。

amy_mhd的博客 730

Java锁相关的面试题

它通过JVM的monitor机制实现,每个对象都有一个monitor,当线程进入同步代码块时,会尝试获取对象的monitor,获取成功则执行代码,执行完或发生异常时释放monitor,其他线程才能获取锁。线程每次获取锁时计数器递增,释放锁时计数器递减,计数器为零时锁被释放。线程每次获取锁时计数器递增,释放锁时计数器递减,计数器为零时锁被释放。线程每次获取锁时计数器递增,释放锁时计数器递减,计数器为零时锁被释放。线程每次获取锁时计数器递增,释放锁时计数器递减,计数器为零时锁被释放。

坚持写博客,大家的关注是我前进的动力! 812

推荐系统[九]项目技术细节讲解z2:搜索Query理解[Term Weight、Query 改写、同义词扩写]和语义召回技术

在 pooling 方法上,我们也尝试过不同层 pooling,或者在多层上增加 attention 聚合 BERT 多层结果,效果和最后一层所有 token 做 average pooling 相当。损失函数方面,在排序阶段使用pairwise比 pointwise 损失函数的效果会更好。

丨汀、的博客 1109

关于java中锁的面试题_Java面试题-Java中的锁

1. 如何实现乐观锁(CAS)?如何避免ABA问题?答:1)读取内存值的方式实现了乐观锁(比如:SVN系统),方法:第一,比较内存值和期望值;第二,替换内存值为要替换值。2)带参数版本来避免aba问题,在读取和替换的时候进行判定版本是否一致2. 读写锁可以用于什么应用场景?答:读写锁可以用于 “多读少写” 的场景,读写锁支持多个读操作并发执行,写操作只能由一个线程来操作ReadWriteLock...

weixin_39870238的博客 934

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【Java超高频面试题&锁&分布式锁】锁相关高频面试题汇总

本期文章将汇总java锁相关的高频面试题,给最近需要找工作的朋友们总结一波,帮助大家全面掌握java锁核心知识点,提升竞争力,为你的面试之旅保驾护航!

longshehui的博客 2789

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

python锁有哪几种_Java中锁有哪些面试题

我们在提到线程安全的时候,会选择锁的方法来进行解决。在java中锁的类型对应被分成了六种,我们接触了两种最多的锁方法是lock和synchronized,这也是面试中最常问到的原理和作用机制题目。下面我们就Java中锁的常见面试题带来展示,大家也来看一看自己能否全部答出。1.synchronized作用于静态方法和非静态方法的区别非静态方法:给对象加锁(可以理解为给这个对象的内存上锁,注意 只是这...

weixin_35683614的博客 231

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java 锁 面试题_Java面试题-Java中的锁

1. 如何实现乐观锁(CAS)?如何避免ABA问题?答:1)读取内存值的方式实现了乐观锁(比如:SVN系统),方法:第一,比较内存值和期望值;第二,替换内存值为要替换值。2)带参数版本来避免aba问题,在读取和替换的时候进行判定版本是否一致2. 读写锁可以用于什么应用场景?答:读写锁可以用于 “多读少写” 的场景,读写锁支持多个读操作并发执行,写操作只能由一个线程来操作ReadWriteLock...

weixin_39644750的博客 1434

面试题——Java中的锁

文章目录1、synchronized 关键字是怎么用的?1.1 构造方法可以使用 synchronized 关键字修饰么?1.2 使用 String 作为锁对象,会有什么问题?1.3 synchronized 的底层原理有了解吗?1.4 还使用过其他锁吗?2、volatile 有什么作用?2.1 原理是什么?2.2 和 synchronized 有什么区别?3. 写一个单例模式 1、synchronized 关键字是怎么用的? synchronized 关键字解决的是多个线程之间访问资源的同步性,sync

Q_P777的博客 3364

Java面试题:Java中的ThreadLocal是如何工作的,Java中的锁优化技术,例如锁粗化和锁消除,Java并发包中的FutureTask是如何工作的

本文将通过几道综合性的面试题,旨在帮助读者深入理解Java内存模型、多线程以及并发编程的原理和应用。面试题二:请解释Java中的锁优化技术,例如锁粗化(Lock Coarsening)和锁消除(Lock Elimination),并讨论它们如何提高并发程序的性能。面试题三:请解释Java并发包中的FutureTask是如何工作的,并给出一个使用FutureTask的示例。面试题一:请解释Java中的ThreadLocal是如何工作的,并讨论其在多线程环境中的使用场景。

码农超哥的博客 412

java中锁的面试题

1. synchronized锁(悲观锁、同步锁) synchronized关键字:表示“同步”的。它可以对“多行代码”进行“同步”——将多行代码当成是一个完整的整体,一个线程如果进入到这个代码块中,会全部执行完毕,执行结束后,其它线程才会执行。这样可以保证这多行的代码作为完整的整体,被一个线程完整的执行完毕。 synchronized被称为“重量级的锁”方式,也是“悲观锁”——效率比较低。 1.1synchronized有几种使用方式: a).同步代码块【常用】 b).同步方法【常

m0_52767002的博客 1万+
上一篇: Java MySQL 连接
下一篇: java面试app_java面试题库app
普通网友
博客等级 码龄4年 3126粉丝 192原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值