博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程透析-锁基本概念
阅读量:2048 次
发布时间:2019-04-28

本文共 1222 字,大约阅读时间需要 4 分钟。

多线程透析-锁基本概念

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

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

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

现在第二个人小华来了 也要上厕所,但是小明并没有结束怎么办呢?

方式一:小华就等呗,来回打转,不停的去看看小明结束没,一旦结束了我立马进去。
方式二:小明防止别人硬上,就在厕所上上一把锁,小华看见被锁住了,只能在一边坐着等着,等锁开了,再进去。

上面两种情况很好理解,恰好线程中锁也是这样。

锁:用于多线程对共享资源竞争时,保证资源的一致性和操作的原子性。

什么意思呢?

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

锁的处理方式:

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

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

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

要想知道这个需要补充几个知识:

1. 用户态 和 内核态
2. CPU调度线程过程

第1点:用户态 和 内核态(上面文章有介绍)

内核态(Kernel Mode):运行操作系统程序,操作硬件
用户态(User Mode):运行用户程序

什么意思呢?

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

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

现在问题来了,是不是轻量级锁效率一定比重量级锁高呢?

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

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

给一个锁的分类图:

在这里插入图片描述

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

转载地址:http://ajhof.baihongyu.com/

你可能感兴趣的文章
剑指offer 66. 和为S的两个数字
查看>>
leetcode 热题 Hot 100-5. 二叉树的最大深度
查看>>
leetcode 热题 Hot 100-2. 有效的括号
查看>>
leetcode 热题 Hot 100-3. 合并两个有序链表
查看>>
leetcode 热题 Hot 100-4. 对称二叉树
查看>>
Leetcode C++《热题 Hot 100-12》226.翻转二叉树
查看>>
Leetcode C++《热题 Hot 100-13》234.回文链表
查看>>
Leetcode C++《热题 Hot 100-14》283.移动零
查看>>
Leetcode C++《热题 Hot 100-15》437.路径总和III
查看>>
Leetcode C++《热题 Hot 100-16》448.找到所有数组中消失的数字
查看>>
Leetcode C++《热题 Hot 100-17》461.汉明距离
查看>>
Leetcode C++《热题 Hot 100-18》538.把二叉搜索树转换为累加树
查看>>
Leetcode C++《热题 Hot 100-19》543.二叉树的直径
查看>>
Leetcode C++《热题 Hot 100-20》617.合并二叉树
查看>>
Leetcode C++《热题 Hot 100-21》581.最短无序连续子数组
查看>>
Leetcode C++《热题 Hot 100-22》2.两数相加
查看>>
Leetcode C++《热题 Hot 100-23》3.无重复字符的最长子串
查看>>
Leetcode C++《热题 Hot 100-24》5.最长回文子串
查看>>
Leetcode C++《热题 Hot 100-25》11.盛最多水的容器
查看>>
Leetcode C++《热题 Hot 100-26》15.三数之和
查看>>