【多线程 3】线程安全之常见的锁策略

🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇

                                线程安全之锁策略                            

🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇

今日推荐歌曲: 达尔文     -- 林俊杰  🎵🎵


系列文章目录

前言

一.  乐观锁 VS 悲观锁 🔒

1. 乐观锁

2. 悲观锁

二. 轻量级锁 VS 重量级锁 🔒

1. 概念

2. 轻重量级与悲乐观锁的区别

三. 自旋锁 和 挂起等待锁 🔒

1. 自旋锁 (Spin Lock)

2. 挂起等待锁

四. 普通互斥锁 和 读写锁 🔒

1.  普通互斥锁

2. 读写锁

五. 公平锁 VS 非公平锁🔒

六. 可重入锁 VS 不可重入锁🔒

1. 可重入锁

2. 不可重入锁

七. 相关⾯试题  ⭐⭐⭐

1. 你是怎么理解乐观锁和悲观锁的,具体怎么实现呢?

 2. 介绍下读写锁?

3. 什么是⾃旋锁 , 为什么要使⽤⾃旋锁策略呢,缺点是什么?

 4. synchronized 是可重⼊锁么?

八. 总结


前言

 锁策略不仅仅是局限于Java. 任何和"锁"相关的话题, 都可能会涉及到以下内容. 这些特性主要是给锁的实现者来参考的. 这类问题是面试官很喜欢问的一类题, 考验一个程序员的功底, 这里主要介绍常用的几大锁策略. 


一.  乐观锁 VS 悲观锁 🔒

       两种不同的锁的实现方式

1. 乐观锁

在加锁之前, 预估当前出现锁冲突的概率不大, 因此在进行加锁的时候就不会做太多的工作.
加锁过程做的事情比较少, 加锁的速度可能就更快,但是更容易引入一些其他的问题 ( 但是可能会消耗更多的cpu资源 ) , 可能会去反复加锁, 消耗更多的 cpu 资源

2. 悲观锁

 在加锁之前,预估当前锁冲突出现的概率比较大,因此加锁的时候,就会做更多的工作.
做的事情更多, 加锁的速度可能更慢, 但是整个过程中不容易出现其他问题~~

举个栗子:

同学A和同学B想请教⽼师⼀个问题.

同学A认为 "⽼师是⽐较忙的,我来问问题,⽼师不⼀定有空解答".  因此同学A会先给⽼师发消息:"⽼师 你忙嘛?我下午两点能来找你问个问题嘛?"(相当于加锁操作)得到肯定的答复之后,才会真的来问问题. 如果得到了否定的答复,那就等⼀段时间,下次再来和⽼师确定时间.这个是悲观锁.

同学B认为"⽼师是⽐较闲的,我来问问题,⽼师⼤概率是有空解答的".因此同学B直接就来找⽼师.(没 加锁,直接访问资源)如果⽼师确实⽐较闲,那么直接问题就解决了.如果⽼师这会确实很忙,那么同学B 也不会打扰⽼师,就下次再来(虽然没加锁,但是能识别出数据访问冲突).这个是乐观锁.

这两种思路不能说谁优谁劣,⽽是看当前的场景是否合适. 如果当前⽼师确实⽐较忙,那么使⽤悲观锁的策略更合适,使⽤乐观锁会导致"⽩跑很多趟",耗费额外 的资源. 如果当前⽼师确实⽐较闲,那么使⽤乐观锁的策略更合适,使⽤悲观锁会让效率⽐较低.


二. 轻量级锁 VS 重量级锁 🔒

1. 概念

  • 轻量级锁,加锁的开销小,加锁的速度更快.=>轻量级锁,一般就是乐观锁
  • 重量级锁,加锁的开销更大,加锁速度更慢.=>重量级锁,一般也就是悲观锁
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值