Java多线程进阶——常见的锁策略

简介: Java多线程进阶——常见的锁策略

1.乐观锁VS悲观锁


这是两种不同的加锁态度:


乐观锁:预测锁冲突的概率不高,所以做的工作比较少一点(简单一点),但效率更高。


悲观锁:预测锁冲突的概率较高,所以做的工作比较多一点(复杂一点),效率更低。


就像我们在与人合租一间房时,A在上厕所时,就比较乐观,觉得这个时候B不会去上厕所,于是就没有锁门(乐观锁)。

而B在上厕所时,就比较悲观,觉得这个时候A来上厕所的概率比较大,于是就上锁了(悲观锁)。


2.读写锁VS普通互斥锁


普通互斥锁:就如同synchronized,当两个线程竞争同一把锁时,就会产生竞争


读写锁:具有加读锁和加写锁两个操作。

读锁和读锁之间,不会产生竞争;写锁和写锁之间会产生竞争;读锁和写锁之间也有竞争。

在实际场景中,读的操作要比写的操作多很多,读写锁要比普通的互斥锁少了很多的锁竞争,优化了效率。


3.重量级锁VS轻量级锁


重量级锁:加锁解锁开销比较大(涉及到进入内核态的加锁逻辑,开销比较大)


轻量级锁:加锁解锁开销比较小(纯用户态的加锁逻辑,开销比较小)


乐观锁/悲观锁是站在加锁/解锁的过程中干的工作的多少看待的。

而重量级锁/轻量级锁是站在加锁/解锁消耗的时间多少看待的。


在通常情况下,干的工作多,消耗的时间也多,因此,一般乐观锁也比较轻量。悲观锁,一般比较重量。


4.自旋锁VS挂起等待锁


自旋锁:在获取锁失败以后,不会立刻释放CPU,而是不断的询问锁的持有状态,一旦锁被释放,就能立刻获取到锁,是轻量级锁的一种典型表现。(自旋就类似于在定时器一篇文章中出现的忙等,消耗了大量CPU,反复询问当前锁是否就绪)


挂起等待锁:在获取锁失败以后,对应的线程就会在内核中挂起等待(放弃CPU,进入等待队列),在锁被释放后由操作系统唤醒,是重量级锁的一种典型实现。


5.公平锁VS非公平锁


公平锁:遵循先来后到的规则,在多个线程等待同一把锁时,谁先来尝试拿锁,那这把锁就是谁的。


非公平锁:遵循随机的规则,在多个线程等待同一把锁时,锁如果释放,每个线程获取到锁的概率是相同的。


6.可重入锁VS不可重入锁


一个线程连续加锁两次,不会造成死锁,就是可重入锁;

反之,如果造成死锁,就是不可重入锁。


7.synchronized特性


对于synchronized:


1.既是乐观锁,也是悲观锁

2.既是轻量级锁,也是重量级锁

3.乐观锁的部分是基于自旋锁实现的,悲观锁的部分是基于挂起等待锁实现的


(synchronized是自适应锁,在初始使用的时候,是乐观锁/轻量级锁/自旋锁,如果锁竞争变的激烈了,synchronized会自动升级成悲观锁/重量级锁/挂起等待锁)


4.不是读写锁,是普通互斥锁

5.是非公平锁

6.是可重入锁

相关文章
|
1天前
|
安全 Java 数据安全/隐私保护
【JAVA进阶篇教学】第十一篇:Java中ReentrantLock锁讲解
【JAVA进阶篇教学】第十一篇:Java中ReentrantLock锁讲解
|
1天前
|
安全 Java
【JAVA进阶篇教学】第十篇:Java中线程安全、锁讲解
【JAVA进阶篇教学】第十篇:Java中线程安全、锁讲解
|
1天前
|
安全 Java
【JAVA进阶篇教学】第六篇:Java线程中状态
【JAVA进阶篇教学】第六篇:Java线程中状态
|
1天前
|
缓存 Java
【JAVA进阶篇教学】第五篇:Java多线程编程
【JAVA进阶篇教学】第五篇:Java多线程编程
|
1天前
|
Java
【JAVA基础篇教学】第十二篇:Java中多线程编程
【JAVA基础篇教学】第十二篇:Java中多线程编程
|
1天前
|
安全 Java
java-多线程学习记录
java-多线程学习记录
|
2天前
|
Java
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
11 0
|
14天前
|
Java 数据库 Android开发
【专栏】Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理
【4月更文挑战第27天】本文探讨了Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理。通过案例分析展示了网络请求、图像处理和数据库操作的优化实践。同时,文章指出并发编程的挑战,如性能评估、调试及兼容性问题,并强调了多线程优化对提升应用性能的重要性。开发者应持续学习和探索新的优化策略,以适应移动应用市场的竞争需求。
|
2天前
|
设计模式 消息中间件 安全
【Java多线程】关于多线程的一些案例 —— 单例模式中的饿汉模式和懒汉模式以及阻塞队列
【Java多线程】关于多线程的一些案例 —— 单例模式中的饿汉模式和懒汉模式以及阻塞队列
9 0
|
2天前
|
Java 数据库
【Java多线程】对线程池的理解并模拟实现线程池
【Java多线程】对线程池的理解并模拟实现线程池
10 1