Java面试篇基础部分-Java语言中的锁有哪些?

  Java中的锁主要是用于保障并发线程场景下的数据一致性问题。在多线程编程中为了保证数据一致性,通常需要在使用对象或者方法之前进行加锁操作。也就是说要保证在同一时间内只能由一个线程来对对象进行修改,从而保证了数据一致性,保证了数据安全问题。

  锁从使用角度上来说可以分为乐观锁和悲观锁,从获取资源的公平性角度上来讲可以分为公平锁和非公平锁,从是否共享资源的角度上来讲可以分为共享锁和独占锁,从锁的状态角度可以分为偏向锁、轻量级锁和重量级锁。

乐观锁

  乐观锁采用了乐观的思想来处理数据,每次读取数据的时候都会认为没有其他人对数据进行修改,所以也就不会上锁,但是在更新的时候会判断是否有人更新过该数据,想要解决这个问题,通常采用的方式就是在写数据的时候先读取出当前的版本号,然后加锁的方式,具体的过程如下

  比较当前版本号与上次的版本号,如果版本号一致,就说明没有更新过,此次就是最新的数据,如果版本号不一致,则进行重复的读写进行比较。

  Java中的乐观锁大部分的场景下是使用CAS(Compare And Swap,比较交换)来实现的,CAS是一种原子更新操作 ,在对数据操作之前首先会比较当前值与传入的值是否一样,如果一样则更新,否则不执行更新操作 ,直接返回失败状态。

悲观锁

  悲观锁采用悲观思想处理数据,也就是说假设在每次读取数据的时候都会认为其他人在修改数据,所以每次在读写数据的时候都会上锁,这样别人想写这个数据的时候就会直接进入到阻塞状态、等待获取到锁。

  Java中的悲观锁大部分的是基于AQS(Abstract Queued Synchronized,抽象的队列同步器)架构来实现。AQS定义了一套多线程访问共享资源的同步架构,许多同步类的实现都依赖于它,例如 Synchroinzed、ReentrantLock、Semaphore、CountDownLatch等等。该框架下的锁首先会尝试一CAS的方式去获取锁,如果获取不到锁,则转换为悲观锁,例如RetreenLock。

自旋锁

  自旋锁:如果持有锁的线程能在很短的时间内释放锁资源,那么这些等待竞争锁的线程就不需要做内核态与用户态之间的切换进入到阻塞、挂起状态,只需要等待一段时间就可以了,也就是自旋。在等待持有锁的线程释放锁之后立即获取到锁,这样就避免了用户线程在内核状态的切换上导致锁的时间消耗。

  线程在自旋时会占用CPU,在线程长时间自旋无法获取到锁,就会导致CPU的浪费,甚至有时线程永远无法获取锁导致CPU资源永远被占用。这个时候就需要设置这个自旋锁的最大自旋时间,有了这个时间以后,如果在这个时间之内没有获取到锁,线程就会退出自旋模式并且释放所持有的锁。

优点

  1、自旋锁在一定程度上减少了CPU上下文之间的切换,可以大幅度的提升锁占用时间短,锁竞争不激烈的代码块的性能。在整个的过程中,CPU耗时是明显少于线程阻塞、挂起、唤醒两次CPU上下文所用的时间。

缺点

  1、如果持有锁的线程占用较长的时间或者获取锁的竞争过于激烈的时候,线程在自旋的过程中会长时间的获取不到资源,导致CPU资源的浪费。所以在有些复杂系统中使用自旋锁的时候要慎重。

  应该如何解决自旋锁的执行时间问题呢?如果自旋锁的执行时间太长了,就会有大量的线程处于自旋状态,占用CPU资源,造成系统资源浪费。所以执行时间的长短设置直接会影响到系统的性能

  JDK在不同的版本中采用了不同的周期,JDK1.5固定DE时间,JDK1.6引入了适应性的自旋锁。适应性的自旋锁自旋时间不是固定的,而是通过上次的时间进行计算得到。可以基本上确定一个线程上下文切换的最佳时间。

相关推荐
lulu12165440782 分钟前
OpenRouter Fusion 多模型融合架构深度拆解:预算级模型组团打平 Fable 5,多模型协作才是 AGI 的正确打开方式?
java·人工智能·架构·ai编程·agi
雨辰AI7 分钟前
生产级实测:SpringBoot3 + 达梦数据库接口从 200ms 优化至 20ms 完整调优指南
java·数据库·spring boot·后端·政务
(Charon)36 分钟前
【C++ 面试高频:内存管理、RAII 和智能指针详解】
java·开发语言·word
凡人叶枫1 小时前
Effective C++ 条款39:明智而审慎地使用 private 继承
java·数据库·c++·嵌入式开发
星哥的编程之路1 小时前
别再调 API 就说自己会 RAG 了,看看真正的企业级 AI 智能体长什么样
后端·面试
轻刀快马1 小时前
跨越软硬件的共鸣(二):从 Cache 写策略看 Redis 与 DB 的一致性博弈
java·开发语言·redis·计算机组成原理
折哥的程序人生 · 物流技术专研1 小时前
Java 23 种设计模式:从踩坑到精通 | 装饰器模式 —— 比继承更灵活的扩展方式,你用过吗?
java·装饰器模式·java面试·结构型模式·java设计模式·javaio·从踩坑到精通
lili00121 小时前
2026 企业 AI 选型新范式:OpenRouter Fusion 证明多模型融合性价比远超单模型,企业该如何重构技术栈? - 微元算力(weytoken)
java·人工智能·python·重构·ai编程
shushangyun_1 小时前
汽车服务行业B2B平台+AI解决方案哪家专业:2026年最新测评
java·运维·网络·数据库·人工智能·汽车