当前位置: 首页 > article >正文

C#如何使用Lock

C#如何使用Lock

在C#中,lock 关键字用于确保当一个线程位于代码的临界区时,其他线程不进入相同的代码区。

lock 关键字是通过在对象上获取互斥锁来实现的。在C#中,每个对象都有一个与之关联的互斥锁。当你在对象上放置一个lock 时,这就指示当前线程获取该对象的互斥锁,而其他任何线程都不能获取同一个对象的锁,直至当前线程释放该锁。

以下是使用 lock 的基本语法:

object lockObject = new object();
lock(lockObject)
{
    // 临界区代码
}

在上述代码中,lockObject 是用于同步的对象,它可以是任何非null对象。在 lock 块内的代码被称为临界区,在这个区域内,当前线程将保持互斥锁,直到它退出区域。

以下是一个使用 lock 的示例,其中两个线程同时对一个共享资源进行读写操作:

using System;
using System.Threading;
 
class Program
{
    static int resource = 0;
    static object lockObject = new object();
 
    static void Main()
    {
        Thread thread1 = new Thread(new ThreadStart(IncrementResource));
        Thread thread2 = new Thread(new ThreadStart(DecrementResource));
 
        thread1.Start();
        thread2.Start();
 
        thread1.Join();
        thread2.Join();
 
        Console.WriteLine($"Resource: {resource}");
    }
 
    static void IncrementResource()
    {
        for (int i = 0; i < 1000; i++)
        {
            lock (lockObject)
            {
                resource++;
            }
        }
    }
 
    static void DecrementResource()
    {
        for (int i = 0; i < 1000; i++)
        {
            lock (lockObject)
            {
                resource--;
            }
        }
    }
}

在这个例子中,我们有一个共享资源 resource,两个线程 thread1 和 thread2 分别对它进行增加和减少操作。使用 lock 确保了每次操作都对 resource 的状态产生原子性的效果。

注意:

始终锁定一个独特的对象(不是this),以避免死锁。

避免在锁内部执行长时间运行的操作,以减少锁定的持续时间。

使用 try...finally 块来确保释放锁,即使在临界区中发生异常也是如此。


http://www.kler.cn/a/452567.html

相关文章:

  • rabbitmq相关使用
  • 如何在 Ubuntu 22.04 上安装 phpMyAdmin
  • Qt creator ,语言家功能缺失解决方法
  • 全局流量管理:提升用户体验与保障服务稳定性
  • Confluent Cloud Kafka 可观测性最佳实践
  • stm32定时器输出比较----驱动步进电机
  • vscode python pip : 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。()
  • 数据结构经典算法总复习(下卷)
  • 快速掌握Haproxy原理架构
  • Suno Api V4模型无水印开发「综合实战开发自己的音乐网站」 —— 「Suno Api系列」第14篇
  • Python基础——字符串
  • 地理数据库Telepg面试内容整理-解释什么是地理空间数据和普通数据的区别
  • C++模板:编译时模拟Duck Typing
  • Modbus数据网关在制造企业的应用与效果
  • 一文详解“递归“在算法中的应用
  • RAGFLOW使用笔记【更新ing】
  • C语言实现顺序表详解
  • FFmpeg音频解码详解
  • 最新版hadoop-3.4.0集群安装和配置(目前论坛的都是老古董了,看我的准没错!!!)这里以三台服务器为例
  • 计算机网络习题( 第3章 物理层 第4章 数据链路层 )
  • 机器学习系列(一)——K-近邻算法
  • leetcode hot100
  • 搭建vue3+vant项目架构
  • WPF的右键菜单项目引入DLL和DllImport特性引入DLL文件的异同点
  • Flutter 实现文本缩放学习
  • 机器人历史