【每天一个小知识】锁的基本思想

简介: 锁的基本思想

在并发环境下,如何对资源进行保护,防止多个线程同时操作一个变量?

我们假定有两个线程来分别从银行卡和存折进行取款操作,当A线程执行完判断语句后,获得了当前账户中的余额数(1000元),因为余额大于取款金额,所以准备执行取钱操作(从账户中减去1000元),但此时它被线程B打断,然后,线程B根据余额(1000),从中取出1000元,然后,将账户里面的余额减去1000元,然后,返回执行线程A的动作,这个线程将从上次中断的地方开始执行:也就是说,它将不再判断账户中的余额,而是直接将上次中断之前获得的余额减去1000。此时,经过两次的取款操作,账户中的余额为100元,从账面上来看,银行支出了1000元,但实际上,银行支出了2000元

640.png

可以看到并发里的一个基本问题:我们希望原子式执行这串动作,但是由于单处理器上的中断或者多个线程在多处理器上并发执行,导致我们做不到,因此引入了锁,用于临界区资源。

锁其实是个变量,我们要声明某种类型的锁变量,如自旋锁、互斥锁,这个锁变量保存了锁在某个时刻的状态。它只有2种状态,要么是可用的,表示没有线程持有该锁;要么是被占用的,表示有一个线程持有锁,正处于临界区。

锁为程序员提供了最小程度的调度控制。进程是由操作系统调度器调度的,而锁则在一定程度上让程序员获得了一些控制权,通过给临界区加锁,可以保证临界区内只有一个线程活跃。

号主:一枚机械专业本科生,经历了转行,从外包逆袭到芯片原厂的Linux驱动开发工程师,深入操作系统的世界,贯彻终身学习、终身成长的理念。平时喜欢折腾,寒冬之下,抱团取暖,期待你来一起探讨技术、搞自媒体副业,程序员接单和投资理财。【对了,不定期送闲置开发板、书籍、键盘等等】。

如果你想了解我的转行经验,欢迎找我交流~gongzhong号【哆哆jarvis】

一起不断探索自我、走出迷茫、找到热爱,希望和你成为朋友,一起成长~


相关文章
|
3月前
|
Python
Python多线程中递归锁如何解决死锁问题的详细阐述
Python多线程中递归锁如何解决死锁问题的详细阐述
|
3月前
|
安全 Python
Python多线程中的死锁与递归锁
Python多线程中的死锁与递归锁
|
4月前
|
安全 Java 程序员
【Java多线程】面试常考——锁策略、synchronized的锁升级优化过程以及CAS(Compare and swap)
【Java多线程】面试常考——锁策略、synchronized的锁升级优化过程以及CAS(Compare and swap)
46 0
|
11月前
|
安全 算法 Java
可重入锁,不可重入锁,死锁的多种情况,以及产生的原因,如何解决,synchronized采用的锁策略(渣女圣经)自适应的底层,锁清除,锁粗化,CAS的部分应用
可重入锁,不可重入锁,死锁的多种情况,以及产生的原因,如何解决,synchronized采用的锁策略(渣女圣经)自适应的底层,锁清除,锁粗化,CAS的部分应用
|
4月前
|
消息中间件
AQS思想
AQS思想
35 0
AQS思想
死锁概念
本章讲解什么是死锁以及如何解决
54 0
|
算法 安全 Java
CAS思想
CAS思想
98 0
|
缓存 Linux 容器
深入了解锁细节
深入了解锁细节
60 0
|
存储 安全 Java
大白话讲解synchronized锁升级套路
synchronized锁是啥?锁其实就是一个对象,随便哪一个都可以,Java中所有的对象都是锁,换句话说,Java中所有对象都可以成为锁。 这次我们主要聊的是synchronized锁升级的套路
107 0
|
存储 安全 Java