多线程透析-锁基本概念

多线程透析-锁基本概念

知道多线程的基本上都知道锁这个东西,现在就来详细说下锁的概念。

先不说直接说锁的概念,老样式还是举例分析下:

举个例子:小明需要上厕所,如果厕所没有人,小明就直接去蹲坑了,这里就类似与小明是一个线程A,厕所是共享资源count。

现在第二个人小华来了 也要上厕所,但是小明并没有结束怎么办呢?
方式一:小华就等呗,来回打转,不停的去看看小明结束没,一旦结束了我立马进去。
方式二:小明防止别人硬上,就在厕所上上一把锁,小华看见被锁住了,只能在一边坐着等着,等锁开了,再进去。

上面两种情况很好理解,恰好线程中锁也是这样。
锁:用于多线程对共享资源竞争时,保证资源的一致性和操作的原子性。

什么意思呢?
很好理解,共享资源竞争,就是小明、小华对厕所的竞争。操作的原子性就是保证其中一个人在操作的时候,不能被打断。
原子性:线程执行时,不被打断。

锁的处理方式:

1.轻量级锁(没有真正的锁 | 自旋锁):就是当共享资源被占用时,其他资源处于自旋状态,频繁的去访问资源是否被持有。如果资源依旧处于被占用状态,就一直自旋,知道资源被释放,底层原理CAS(下篇介绍)。因为该方式没有本质上加上锁就不需要请求OS操作系统,这样效率会更高,所以被称为轻量级锁(对应方式一,是不是很好好理解)**

2.重量级锁:加上锁,线程必须等待另一个线程释放锁,才能使用资源,如果锁未释放,则该线程会处于等待状态,不需要自旋。

那么轻量级锁和重量级锁哪个更好呢?

要想知道这个需要补充几个知识:
1. 用户态 和 内核态
2. CPU调度线程过程

第1点:用户态 和 内核态(上面文章有介绍线程透析–进程和线程底层分析
内核态(Kernel Mode):运行操作系统程序,操作硬件
用户态(User Mode):运行用户程序

什么意思呢?
通过上面的介绍很容易知道,轻量级锁就是程序级别的运行,因为它这是采用频繁的自旋访问过程。所以它属于用户态线程。

而重量级锁在锁被占用的时候,被加入到OS的等待队列中,等待OS的CFS调度机制调度,这个上面文章我们已经透析过了CPU调度多线程的一个过程多线程透析–进程和线程底层分析。这个属于内核态线程,它需要与操作系统打交道,需要切换到内核态,而这个过程正是一个会消耗效率的过程,都是因为在等待过程中不会自旋,就不会消耗CPU。

现在问题来了,是不是轻量级锁效率一定比重量级锁高呢?
哦服阔斯闹特,想一想,轻量级锁采用自旋的方式,频繁请求,那如果线程很多很多的情况下,很多线程都处于长时间或者无线自旋的状态,都在频繁的请求,CPU就会被大大消耗,最终甚至崩溃。而重量级锁就不会消耗CPU。这个时候显然重量级锁会更好。
要是在很少线程的时候,线程自旋很少次数,就会可以结束,这样就大大提高了效率,因为不用更操作系统打交道。

所以轻量级效率不一定大于重量级 (主要看线程执行时间)

给一个锁的分类图:
在这里插入图片描述

下一篇正好透析下,synchronize锁,会讲到自旋锁的机制。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Survivor001

你可以相信我,如果你愿意的话

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值