首页 > 编程语言 >程序中,对锁的理解

程序中,对锁的理解

时间:2024-05-03 16:44:47浏览次数:23  
标签:加锁 对锁 Lock 程序 读锁 并发 死锁 理解 线程

在并发编程中,加锁是为了保证数据的完整性和一致性,

在程序中,特别是并发编程的上下文中,**锁**(Lock)是一种同步机制,用于控制多个线程或进程对共享资源的访问,以防止数据竞争(Data Race)和保持数据一致性。当多个执行单元(如线程)试图同时访问或修改同一份共享资源时,如果没有适当的同步措施,就可能导致不可预测的结果,比如数据损坏、死锁或者竞态条件。锁的作用就像是一个门卫,确保同一时间只允许一个执行单元进入“受保护”的代码区域(称为临界区),执行完毕后才会释放锁,让其他等待的执行单元有机会进入。

锁的基本类型和概念包括但不限于:

1. **互斥锁(Mutex)**:是最基本的锁类型,允许多个线程排队访问共享资源,一次只允许一个线程持有锁。其他试图获取锁的线程将被阻塞,直到锁被释放。

2. **读写锁(Read-Write Lock)**:分为读锁和写锁。读锁可以被多个线程同时持有,只要没有写锁存在;写锁则是排他的,任何时刻只能有一个线程持有写锁,且不允许读锁和写锁同时存在。这在读多写少的场景下能提高并发性能。

3. **自旋锁(Spin Lock)**:当线程尝试获取锁失败时,不是立即挂起(阻塞),而是不断地循环检查(自旋),直到锁变为可用状态。适用于锁持有时间短且CPU核心数较少的情况。

4. **可重入锁(Reentrant Lock)**:允许同一个线程多次获取同一把锁,而不会发生死锁。线程每次获取锁都会增加一个计数器,释放锁时计数器减一,当计数器为零时锁才真正释放。

5. **乐观锁和悲观锁**:这是更高级的概念,通常在数据库事务处理中讨论。乐观锁假定读多写少,数据一般不会冲突,操作时不加锁,更新时判断数据是否被其他事务修改过。悲观锁则假定最坏情况,认为数据会经常冲突,因此一开始就加锁。

正确使用锁是并发编程中的关键,可以确保程序的正确性、一致性和性能。但同时也需要注意,过度使用或不当使用锁会导致死锁、性能下降等问题。

标签:加锁,对锁,Lock,程序,读锁,并发,死锁,理解,线程
From: https://www.cnblogs.com/maidongdong/p/18171345

相关文章

  • Python深入理解*和**含义和应用
    本文源代码:https://gitee.com/obullxl/PythonCS/tree/master/CS-CY2405Python中*和**很常见禅师在阅读Python代码过程中,经常看到一个函数或方法的入参是*args和**kwargs(如:deffunc(*args,**kwargs)等)形式,或者在调用函数或方法时,在入参的元组和列表前面增加1个*号(如:func(*(1,2,......
  • 【排课小工具】排课程序设计与实现
    课表的完整性意味着,可分配的节点的数量大小等于课表周数的累加和大小,为了进行完整性检测我需要两个对象:课表模板以及课程对象,从课表模板中获取可分配的节点数,从课程对象中获取该课程的上课周次。用户要求每个班级的课表模板相同,这使得完整性检测容易很多。分级填充需求主要和课程......
  • 【排课小工具】排课程序设计与实现
    课表的完整性意味着,可分配的节点的数量大小等于课表周数的累加和大小,为了进行完整性检测我需要两个对象:课表模板以及课程对象,从课表模板中获取可分配的节点数,从课程对象中获取该课程的上课周次。用户要求每个班级的课表模板相同,这使得完整性检测容易很多。分级填充需求主要和课程......
  • 我对操作系统的理解
    当我们谈论操作系统时,我们可以将其视为计算机的“大管家”或“资源调配师”。它管理着计算机的硬件和软件资源,确保它们得到合理的分配和使用。具体来说,操作系统具有以下几个核心功能:进程管理:操作系统负责协调和控制计算机上运行的程序。它确保每个进程都能得到适当的CPU时间,从而实......
  • 如何同时或者按顺序间隔启动多个程序
    首先,需要用到的这个工具:度娘网盘提取码:qwu2蓝奏云提取码:2r1z1、打开工具,切换到定时器模块,快捷键:Ctrl+3 2、新建一个定时器,我这里演示同时打开多个程序(比如同时启动多个QQ,或者多个微信等),那就把单次数量提高,如果想每次执行这个定时器里面的3个事件,那单次数量就是写3,我......
  • 个人网页-测试程序-网页成功与api交互但未显示好的图片
    python:fromflaskimportFlask,render_template,request,jsonifyimportrequestsimportbase64importosfromPILimportImageimportioimportlogging#ConfigureFlaskapplicationapp=Flask(__name__,template_folder='../templates')app.c......
  • 51单片机程序框架之按键单击
    /******************************************************************************此程序是依据吴坚鸿程序框架,在普中51A2单片机开发板上的程序练习程序目标:按键单击,Key1按下,LED灯亮,Key2按下LED灭************************************************************************......
  • c#胖东来小程序自动购物程序(接单,windows桌面程序、linux程序、网络应用等等)
    一、程序效果自动打开胖东来小程序,自动购物 二、实现先截屏,然后利用opencv库识别下一步按键所在位置,然后使用mouse_event控制鼠标,模拟人的动作第一步,截取屏幕staticBitmapCaptureScreen(){intscreenWidth=Screen.PrimaryScreen.Bounds.Width;intscreenHe......
  • 程序员天天 CURD,怎么才能成长,职业发展的思考 ?
    前言关于程序员成长的话题,我前面写过一篇文章-程序员天天CURD,职业生涯怎么发展的思考。现在回头看,对程序员这个职业发展的认识以及怎么发展还是有一些局限性。有一句话是这么说的:人的成长就是不断认为以前的自己是一个“傻逼”的过程。这句话用词很激烈但成长也许就是如此。人......
  • 一个demo快速理解序列号和反序列化
    一个demo快速理解序列号和反序列化分享一个例子用来快速理解序列化和反序列化其实序列化和反序列化就是为了交换数据,(简单粗暴的理解就是把运行中的对象存进文件里面)importjava.io.*;publicclassMain{publicstaticvoidmain(String[]args)throwsException{......