好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C#中的线程锁及使用实例

一、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();

            }

        }

    }

}


查看更多关于C#中的线程锁及使用实例的详细内容...

  阅读:2次