用C#实现互斥操作

1、传统的lock

lock简单易用,适合大多数场景,但在高竞争用情况下可能会导致线程阻塞;

cs 复制代码
        Object obj = new object(); 
        void method1()
        {
            lock (obj)
            {
                // 进行互斥操作
            }
        }

2、SpinLock

SpinLock在低延迟情况下更有效,因为SpinLock会在忙等待(spin)中尝试获取锁;但在高竞用时,可能导致更高的CPU使用率。

SpinLock适合短时间锁定,而lock更通用。选择时需要根据具体的使用场景和性能需求来决定。

cs 复制代码
        SpinLock spinLock = new SpinLock();
        void method2()
        {
            bool lockTaken = false;
            spinLock.Enter(ref lockTaken);
            try
            {
                // 进行互斥操作
            }
            finally
            {
                if (lockTaken)
                {
                    spinLock.Exit(true);
                }
            }
        }

注意:

SpinLock.Exit方法中,参数决定是否在释放锁时记录锁的状态。一般情况下:

  • Exit(true):用于锁被当前线程正常获取,表示锁状态已被正确管理,适合在正常退出时使用。
  • Exit(false):用于锁可能被异常获取,通常在某些特殊情况下使用,表示不强制解除锁状态。

在大多数普通场景中,使用Exit(true)更为合适,Exit(false)则少用。

3、Mutex

Mutex可以跨进程使用,适合更广泛的场景

cs 复制代码
Mutex mutex = new Mutex();
mutex.WaitOne(); // 获取锁
try 
{
    // 进行互斥操作
} 
finally 
{
    mutex.ReleaseMutex(); // 释放锁
}

4、SemaphoreSlim

SemaphoreSlim用于限制同一时间访问资源的数量;

cs 复制代码
SemaphoreSlim semaphore = new SemaphoreSlim(1); // 初始化为1
await semaphore.WaitAsync(); // 获取锁
try 
{
    // 进行互斥操作
} 
finally 
{
    semaphore.Release(); // 释放锁
}

5、ReaderWriterLockSlim

ReaderWriterLockSlim则允许多个线程读取、但在写入时会独占访问;

cs 复制代码
ReaderWriterLockSlim rwLock = new ReaderWriterLockSlim();


rwLock.EnterReadLock(); // 获取读锁
try 
{
    // 进行读操作
} 
finally 
{
    rwLock.ExitReadLock(); // 释放读锁
}



rwLock.EnterWriteLock(); // 获取写锁
try 
{
    // 进行写操作
} 
finally 
{
    rwLock.ExitWriteLock(); // 释放写锁
}
相关推荐
binishuaio5 分钟前
Java 第11天 (git版本控制器基础用法)
java·开发语言·git
zz.YE7 分钟前
【Java SE】StringBuffer
java·开发语言
就是有点傻11 分钟前
WPF中的依赖属性
开发语言·wpf
洋24019 分钟前
C语言常用标准库函数
c语言·开发语言
进击的六角龙21 分钟前
Python中处理Excel的基本概念(如工作簿、工作表等)
开发语言·python·excel
wrx繁星点点22 分钟前
状态模式(State Pattern)详解
java·开发语言·ui·设计模式·状态模式
NoneCoder39 分钟前
Java企业级开发系列(1)
java·开发语言·spring·团队开发·开发
苏三有春39 分钟前
PyQt5实战——UTF-8编码器功能的实现(六)
开发语言·qt
Aniay_ivy1 小时前
深入探索 Java 8 Stream 流:高效操作与应用场景
java·开发语言·python
鸿儒5171 小时前
C++ lambda 匿名函数
开发语言·c++