🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇
线程安全之锁策略
🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇
今日推荐歌曲: 达尔文 -- 林俊杰 🎵🎵
系列文章目录
3. 什么是⾃旋锁 , 为什么要使⽤⾃旋锁策略呢,缺点是什么?
前言
锁策略不仅仅是局限于Java. 任何和"锁"相关的话题, 都可能会涉及到以下内容. 这些特性主要是给锁的实现者来参考的. 这类问题是面试官很喜欢问的一类题, 考验一个程序员的功底, 这里主要介绍常用的几大锁策略.
一. 乐观锁 VS 悲观锁 🔒
两种不同的锁的实现方式
1. 乐观锁
在加锁之前, 预估当前出现锁冲突的概率不大, 因此在进行加锁的时候就不会做太多的工作.
加锁过程做的事情比较少, 加锁的速度可能就更快,但是更容易引入一些其他的问题 ( 但是可能会消耗更多的cpu资源 ) , 可能会去反复加锁, 消耗更多的 cpu 资源
2. 悲观锁
在加锁之前,预估当前锁冲突出现的概率比较大,因此加锁的时候,就会做更多的工作.
做的事情更多, 加锁的速度可能更慢, 但是整个过程中不容易出现其他问题~~
举个栗子:
同学A和同学B想请教⽼师⼀个问题.
同学A认为 "⽼师是⽐较忙的,我来问问题,⽼师不⼀定有空解答". 因此同学A会先给⽼师发消息:"⽼师 你忙嘛?我下午两点能来找你问个问题嘛?"(相当于加锁操作)得到肯定的答复之后,才会真的来问问题. 如果得到了否定的答复,那就等⼀段时间,下次再来和⽼师确定时间.这个是悲观锁.
同学B认为"⽼师是⽐较闲的,我来问问题,⽼师⼤概率是有空解答的".因此同学B直接就来找⽼师.(没 加锁,直接访问资源)如果⽼师确实⽐较闲,那么直接问题就解决了.如果⽼师这会确实很忙,那么同学B 也不会打扰⽼师,就下次再来(虽然没加锁,但是能识别出数据访问冲突).这个是乐观锁.
这两种思路不能说谁优谁劣,⽽是看当前的场景是否合适. 如果当前⽼师确实⽐较忙,那么使⽤悲观锁的策略更合适,使⽤乐观锁会导致"⽩跑很多趟",耗费额外 的资源. 如果当前⽼师确实⽐较闲,那么使⽤乐观锁的策略更合适,使⽤悲观锁会让效率⽐较低.
二. 轻量级锁 VS 重量级锁 🔒
1. 概念
- 轻量级锁,加锁的开销小,加锁的速度更快.=>轻量级锁,一般就是乐观锁
- 重量级锁,加锁的开销更大,加锁速度更慢.=>重量级锁,一般也就是悲观锁