一、C#中的各种线程锁及说明:
lock关键字:基于Monitor实现,自动管理锁生命周期
Monitor类:提供手动控制锁获取/释放的底层机制
Mutex类:系统范围锁,支持跨进程同步
每种锁均通过1000线程测试计数器,验证线程安全
输出结果应均为1000,证明锁机制有效
lock和Monitor适用于进程内同步,Mutex适用于跨进程场景
Monitor支持更细粒度控制(如超时),Mutex支持跨进程同步
代码如下:
using System;
using System.Threading;
class Program
{
static void Main()
{
// 1. lock关键字(Monitor语法糖)
object lockObj = new object();
int counter = 0;
for (int i = 0; i < 1000; i++)
{
Thread t = new Thread(() =>
{
lock (lockObj) // 自动获取/释放锁
{
counter++;
}
});
t.Start();
}
Thread.Sleep(1000); // 等待线程完成
Console.WriteLine($"lock计数: {counter}"); // 应为1000
// 2. Monitor类(底层实现)
int monitorCounter = 0;
for (int i = 0; i < 1000; i++)
{
Thread t = new Thread(() =>
{
bool lockTaken = false;
try
{
Monitor.Enter(lockObj, ref lockTaken); // 手动获取锁
monitorCounter++;
}
finally
{
if (lockTaken) Monitor.Exit(lockObj); // 手动释放锁
}
});
t.Start();
}
Thread.Sleep(1000);
Console.WriteLine($"Monitor计数: {monitorCounter}"); // 应为1000
// 3. Mutex(跨进程锁)
Mutex mutex = new Mutex();
int mutexCounter = 0;
for (int i = 0; i < 1000; i++)
{
Thread t = new Thread(() =>
{
mutex.WaitOne(); // 获取锁
mutexCounter++;
mutex.ReleaseMutex(); // 释放锁
});
t.Start();
}
Thread.Sleep(1000);
Console.WriteLine($"Mutex计数: {mutexCounter}"); // 应为1000
}
}
二、C#中程序开发中跨进程锁的实例
using System;
using System.Threading;
class Program
{
private static Mutex mutex = null;
const string MUTEX_NAME = "Global\\MyAppMutex"; // 命名Mutex实现跨进程同步
static void Main()
{
// 尝试创建命名Mutex
bool createdNew;
try
{
mutex = new Mutex(false, MUTEX_NAME, out createdNew);
}
catch (AbandonedMutexException)
{
Console.WriteLine("检测到被遗弃的Mutex,可能由异常退出进程持有");
createdNew = false;
}
if (!createdNew)
{
Console.WriteLine("程序已在运行,退出当前实例");
return;
}
try
{
Console.WriteLine("程序正在运行... 按任意键退出");
Console.ReadKey();
}
finally
{
// 释放Mutex
if (mutex != null)
{
mutex.ReleaseMutex();
mutex.Close();
}
}
}
}