博客
关于我
强烈建议你试试无所不能的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/

你可能感兴趣的文章
Oracle PL/SQL语言初级教程之完整性约束
查看>>
PL/SQL学习笔记
查看>>
如何分析SQL语句
查看>>
结构化查询语言(SQL)原理
查看>>
SQL教程之嵌套SELECT语句
查看>>
几个简单的SQL例子
查看>>
日本語の記号の読み方
查看>>
计算机英语编程中一些单词
查看>>
JavaScript 经典例子
查看>>
判断数据的JS代码
查看>>
js按键事件说明
查看>>
AJAX 初次体验!推荐刚学看这个满好的!
查看>>
AJAX 设计制作 在公司弄的 非得要做出这个养的 真晕!
查看>>
Linux 查看文件大小
查看>>
Java并发编程:线程池的使用
查看>>
redis单机及其集群的搭建
查看>>
Java多线程学习
查看>>
检查Linux服务器性能
查看>>
Java 8新的时间日期库
查看>>
Chrome开发者工具
查看>>