锁的概念及整理(简单理解)
公平锁与非公平锁
公平锁:
- 特点:多个线程在等待同一把锁,等待时间最长的将获得锁
- 优点:所有的线程都能获得资源,不会饿死在队列中
- 缺点:吞吐量下降,除了队列中的第一个线程,其余线程都会被阻塞,cpu唤醒线程的开销较大
非公平锁:
- 特点:如果有多个线程请求同一个锁,那个该锁将随机分配给其中的一个线程
- 优点:减少 CPU 唤醒线程的开销,吞吐量有所提高
- 缺点:存在线程一直无法获取到锁的可能性,导致线程饿死
乐观锁与悲观锁
乐观锁:
- 特点: 总是假设最糟糕的情况,认为每次读取数据时都会被修改,为了避免脏读的情况出现,在每次读取数据时都会加上锁
- 优点:能够有效的避免脏读的情况
- 缺点:效率低下
- 示例: synchronized 关键字 和 JUC 的 lock
悲观锁:
- 特点:总是假设最好的情况,认为每次读取数据时都不会被修改,所以不会上锁,但在更新数据时会判断数据是否被修改
- 优点:便于提高吞吐量
- 示例:JUC 的原子变量(CAS)
重入锁与不可重入锁
可重入锁:
- 特点: 在当前代码段中, 已获取对象 A 的锁,但是在改代码段中,掉用的另一个函数也需要获取对象 A 的锁,那么为了保证线程不被阻塞,函数能够顺利获得该对象的锁,那么这样的锁便是可重入锁。反之则称为不可重入锁。
- 示例: 例如 Reentaran* 的类,均是可重入的锁
【示例】
public synchronized void f1(){
// code...
f2()
// code...
}
public synchronized void f2(){
}
假设在同一个对象中,有两个函数 f1()
,f2()
,在 f1
中调用 f2
,此时 f1
已获得锁,如果 f2
未能获得锁,该进程便会被阻塞,即 f2
无法获得 f1
的锁,这样的锁便被称为不可重入锁。为了保证进程顺利运行,那么就需要 f2
能够获得 f1
得到的锁,这样重复得到的锁被称之为可重入锁
公平锁与非公平锁
公平锁
- 概念: 当发生线程之间对于锁的竞争时,如果线程按照进入等待队列的先后次序获得锁,这样按照先进先出规则的策略就被称之为公平锁。
非公平锁
- 概念: 当线程竞争锁时,线程不用按照先来后到的顺序,谁先抢到锁,那个锁就是谁的,这样的锁便被称为非公平锁
自旋锁
自旋锁:
- 特点:当一个线程拿不到锁时,并不会放弃 CPU ,而是通过循环去不停的尝试去获取锁,这就是所谓的自旋锁
- 示例: JUC 中 Atomic 类,皆是带有自选性质的锁
偏向锁
偏向锁
- 特点:偏向锁的意思是锁会偏向于第一个获得它的线程,当锁对象第一次被其他线程获取时,虚拟机会将线程的 id 记录在对象的 MarkWord 中,如果 CAS 操作执行成功,则持有偏性锁的线程每次进入相同的同步块时,虚拟机都不需要再进行任何同步操作(加锁、解锁、MarkWord的更新等)只要在执行过程中,该锁对象一值没有被其他对象获取,则持有偏向锁的对象不需要同步。
轻量级锁和重量级锁
轻量级锁
轻量级锁其设计目的是在没有线程竞争情况下,单一线程进入同步代码块时,在没有其他线程进行竞争的情况下,减少当前线程重复进行同步操作所带来的消耗。偏向锁就是一种轻量级锁。
重量级锁
重量级锁指的是使用操作系统互斥量来实现的传统锁
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。
它的内容包括:
- 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
- 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
- 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
- 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
- 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
- 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
- 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
- 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw
目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:
想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询
同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。