C#Lock锁

embedded/2024/11/15 0:51:13/

问题:避免使用lock(this)或lock(string),因为无法保证你提供的方法,在外部类中使用的时候,开发人员会不会锁定当前对象。
解决方法:最佳做法是定义 private 对象来锁定, 或 private static 对象变量来保护所有实例所共有的数据。最好使用私有的静态只读的锁对象,保证不会影响其他逻辑的正常执行。
 

       private static readonly object obj = new object();

       lock(obj){

        //操作

        }

延伸

 lock(this) 锁定当前实例对象,如果有多个类实例的话,lock锁定只是锁定当前类实例,对其他类实例无影响

lock(typeof(Model))锁定的是model类的所有实例

lock(obj)锁定的对象是全局的私有化静态变量。外部无法对该变量进行访问

lock确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则他将一直等待(即被阻止),直到该对象被释放。

所有lock的结果好不好还是要看锁的是谁,如果外摆你能对这个锁住的对象进行修改则lock就失去了作用没有意义。一般情况下使用私有的静态、只读的对象。

注:锁住的必须是引用类型的对象,string类型除外。锁定字符串非常危险,因为字符串被公共语言运行库 (CLR)“暂留”。 这意味着整个程序中任何给定字符串都只有一个实例,就是这同一个对象表示了所有运行的应用程序域的所有线程中的该文本。因此,只要在应用程序进程中的任何位置处具有相同内容的字符串上放置了锁,就将锁定应用程序中该字符串的所有实例。通常,最好避免锁定 public 类型或锁定不受应用程序控制的对象实例。例如,如果该实例可以被公开访问,则 lock(this) 可能会有问题,因为不受控制的代码也可能会锁定该对象。这可能导致死锁,即两个或更多个线程等待释放同一对象。出于同样的原因,锁定公共数据类型(相比于对象)也可能导致问题。而且lock(this)只对当前对象有效,如果多个对象之间就达不到同步的效果。lock(typeof(Class))与锁定字符串一样,范围太广了。


http://www.ppmy.cn/embedded/7062.html

相关文章

贪心算法中常见的使用方法逻辑整理

贪心算法 常见的使用方法逻辑整理 1. 贪心算法 特点 贪心算法,又名贪婪法,是寻找最优解问题的常用方法,这种方法模式一般将求解过程分成若干个步骤,但每个步骤都应用 贪心原则 ,选取当前状态下最好/最优的选择&#x…

Android网络安全配置:允许明文HTTP通信的正确姿势20240418

引言: 随着Android 9 (Pie) 的发布,Google加强了平台的安全性要求,特别是对网络通信的安全性进行了重大更新。默认情况下,Android系统禁止应用使用未加密的明文HTTP进行网络通信。这篇博客将介绍如何在遵守新安全政策的同时&…

React中redux、react-redux、@reduxjs/toolkit状态管理库的使用方式

效果 下载依赖 npm install redux react-redux reduxjs/toolkit --save在src目录下创建文件 创建index.ts文件 import { configureStore } from reduxjs/toolkit import userSlice from ./userReducerconst store configureStore({reducer: {user: userSlice.reducer} }) //…

Python 数据结构和算法实用指南(二)

原文:zh.annas-archive.org/md5/66ae3d5970b9b38c5ad770b42fec806d 译者:飞龙 协议:CC BY-NC-SA 4.0 第四章:列表和指针结构 我们已经在 Python 中讨论了列表,它们方便而强大。通常情况下,我们使用 Python…

【linux运维】系统常见管理命令

系列综述: 💞目的:本系列是个人整理为了学习基本的shell编程和linux命令,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于b站大学——linux运维课程进行的,…

目标检测——食品饮料数据集

一、重要性及意义 对食品和饮料进行目标检测的重要性和意义体现在多个方面: 商业应用与市场分析:目标检测技术在食品和饮料行业有着广泛的应用前景。通过对超市货架、餐馆菜单或广告海报中的食品和饮料进行自动识别和计数,商家可以获取关于产…

OpenHarmony网络组件-Mars

项目简介 Mars 是一个跨平台的网络组件,包括主要用于网络请求中的长连接,短连接,是基于 socket 层的解决方案,在网络调优方面有更好的可控性,暂不支持HTTP协议。 Mars 极大的方便了开发者的开发效率。 效果演示 编译…

【IC前端虚拟项目】测试点思路和文档编写

【IC前端虚拟项目】数据搬运指令处理模块前端实现虚拟项目说明-CSDN博客 好,又到了测试点文档了这一部分了,我经常跟带着学习的童鞋说,对于芯片验证人来说测试点文档就是最重要的一个交付文件,也是在项目交付中最为看重的进度衡量…