多线程的锁策略
文章目录
- 前言
- 一.乐观锁与悲观锁
- 二.轻量级锁和重量锁
- 三.自旋锁和挂起等待锁
- 四.互斥锁和读写锁
- 五.不可重入锁和可重入锁
- 六.公平锁和非公平锁
前言
其实这里指的锁策略,不只只是线程才存在的。也不只是针对Java的,我现在就即将介绍常见的锁策略。
一.乐观锁与悲观锁
乐观锁:预测接下来的事情的冲突概率不大
悲观锁:预测接下来的事情冲突概率很大
这里说俩个概念,可能很抽象。但我们拿我们大学的期末考试举例子,明天要考试了,你丝毫对成绩不在乎能过就行,你的室友通宵复习,在思考接下来发生的种种事情,觉得自己会挂科,会重修,然后就焦虑焦虑焦虑,这里面充当的角色(你)是乐观锁,你的室友是悲观锁。
这里俩个锁的通常来说,悲观锁做的事情要多一点,效率低,乐观锁做的事情要少一些,效率低。
如果说没有理解到乐观锁与悲观锁的例子,那我画一个图大家理解一下
二.轻量级锁和重量锁
轻量级锁加锁解锁过程更高效
重量级锁,加锁解锁更慢,更低效
当然乐观锁也可能是一个轻量级锁
一个悲观锁也可能是一个重量级锁
三.自旋锁和挂起等待锁
自旋锁是轻量级锁一种经典的一个实现
挂起等待锁是重量级锁一种经典的一个实现
我先来说说什么是自旋锁
就拿我追女神来说,我舔女神,女神给我发好人卡,这就是加锁失败了。但如果我每天锲而不舍的去,向女生问候早安,午安,晚。突然有一天,女生跟他现在的男朋友分手了,此时我的机会不就来了,趁机上位。
这个情况就是,我尝试不断加锁,如果锁突然释放,我就会第一时间拿到锁.但这里有个弊端,就是我得整天围着她转,什么也干,这就是CPU的忙等。消耗资源。
什么是挂起等待锁呢?
我追女神追不到,我就先不搭理女神了,去干其他的事情,突然有一天女神想起我了,她主动来找我,那我高兴坏了,这个时候我的机会就来了。
换言之如果锁被释放,不会第一时间拿到锁,这时候等待的过程中有空闲时间,我可以干别的事情。
四.互斥锁和读写锁
怎么说呢?sychronize就是互斥锁,互斥锁只是单纯的加锁和解锁操作罢了。
读写锁才是重点
读写锁,简而言之,就是把读和写这两种加锁分开。另外他有一种特殊的场景,多线程同时对一个数据的访问和修改。
读写锁的过程:
1给读加锁
2给写加锁
3解锁
读写锁的约定:
1.读锁和解锁之间,不会存在锁竞争
2.写锁和写锁之间,有锁竞争
3.读锁和写锁之间有锁竞争
下面是一个例子:
五.不可重入锁和可重入锁
大概就是一个锁,在一个线程中连续加锁俩次不死锁,叫可重入锁,如果死锁了,叫不可重入锁。
这个我们还是来举一个例子
六.公平锁和非公平锁
此处对于公平与不公平的定义就是是不是遵循先来后到原则。
遵循的是公平锁
不遵循的是非公平锁