读写锁ReaderWriterLockSlim

对于读锁:获取读锁后、其他线程可再获取读锁、但其他线程不能获取写锁(直到所有读锁释放)
如下代码示例:

using System;
using System.Threading;

namespace ReaderWriterDemo
{
    internal class Program
    {
        static void Main(string[] args)
        {
            TestReadeWriterLock testReadeWriterLock = new TestReadeWriterLock();

            for (int i = 0; i < 3; i++)
            {
                Thread threadr = new Thread(() =>
                {
                    testReadeWriterLock.Read();
                });
                threadr.Start();
            }
            //保证上面已经获取读锁
            Thread.Sleep(100);
            for (int i = 0; i < 5; i++)
            {
                Thread thread = new Thread(() =>
                {
                    testReadeWriterLock.Add();
                });
                thread.Start();
            }


            Console.ReadLine();
        }
    }

    public class TestReadeWriterLock
    {
        private readonly ReaderWriterLockSlim lockSlim = new ReaderWriterLockSlim();

        private int sum;

        public void Add()
        {
            try
            {
                Console.WriteLine($"{DateTime.Now:HH:mm:ss fff} {Thread.CurrentThread.ManagedThreadId} 等待获取写锁");
                lockSlim.EnterWriteLock();
                Console.WriteLine($"{DateTime.Now:HH:mm:ss fff} {Thread.CurrentThread.ManagedThreadId} 成功获取写锁");
                for (int i = 0; i < 50000; i++)
                {
                    sum++;
                }
            }
            catch (Exception ex)
            {

            }
            finally
            {
                Console.WriteLine($"{DateTime.Now:HH:mm:ss fff} {Thread.CurrentThread.ManagedThreadId} 写入完成");
                lockSlim.ExitWriteLock();
            }
        }

        public void Read()
        {
            try
            {
                Console.WriteLine($"{DateTime.Now:HH:mm:ss fff} {Thread.CurrentThread.ManagedThreadId} 等待获取读锁");
                lockSlim.EnterReadLock();
                Console.WriteLine($"{DateTime.Now:HH:mm:ss fff} {Thread.CurrentThread.ManagedThreadId} 成功获取读锁");
                Thread.Sleep(2000);
            }
            catch (Exception ex)
            {

            }
            finally
            {
                Console.WriteLine($"{DateTime.Now:HH:mm:ss fff} {Thread.CurrentThread.ManagedThreadId} 读取完成");
                lockSlim.ExitReadLock();
            }
        }
    }
}

运行结果
所有读锁释放后才能获取写锁

对于写锁:获取写锁后、其他线程不能再获取读锁和写锁、知道写锁释放其他读、写线程才有机会

using System;
using System.Threading;

namespace ReaderWriterDemo
{
    internal class Program
    {
        static void Main(string[] args)
        {
            TestReadeWriterLock testReadeWriterLock = new TestReadeWriterLock();

            for (int i = 0; i < 5; i++)
            {
                Thread thread = new Thread(() =>
                {
                    testReadeWriterLock.Add();
                });
                thread.Start();
            }
            //保证上面已经获取写锁
            Thread.Sleep(100);

            for (int i = 0; i < 3; i++)
            {
                Thread threadr = new Thread(() =>
                {
                    testReadeWriterLock.Read();
                });
                threadr.Start();
            }
            Console.ReadLine();
        }
    }

    public class TestReadeWriterLock
    {
        private readonly ReaderWriterLockSlim lockSlim = new ReaderWriterLockSlim();

        private int sum;

        public void Add()
        {
            try
            {
                Console.WriteLine($"{DateTime.Now:HH:mm:ss fff} {Thread.CurrentThread.ManagedThreadId} 等待获取写锁");
                lockSlim.EnterWriteLock();
                Console.WriteLine($"{DateTime.Now:HH:mm:ss fff} {Thread.CurrentThread.ManagedThreadId} 成功获取写锁");
                Thread.Sleep(2000);
                for (int i = 0; i < 50000; i++)
                {
                    sum++;
                }
            }
            catch (Exception ex)
            {

            }
            finally
            {
                Console.WriteLine($"{DateTime.Now:HH:mm:ss fff} {Thread.CurrentThread.ManagedThreadId} 写入完成");
                lockSlim.ExitWriteLock();
            }
        }

        public void Read()
        {
            try
            {
                Console.WriteLine($"{DateTime.Now:HH:mm:ss fff} {Thread.CurrentThread.ManagedThreadId} 等待获取读锁");
                lockSlim.EnterReadLock();
                Console.WriteLine($"{DateTime.Now:HH:mm:ss fff} {Thread.CurrentThread.ManagedThreadId} 成功获取读锁");
                Thread.Sleep(200);
            }
            catch (Exception ex)
            {

            }
            finally
            {
                Console.WriteLine($"{DateTime.Now:HH:mm:ss fff} {Thread.CurrentThread.ManagedThreadId} 读取完成");
                lockSlim.ExitReadLock();
            }
        }
    }
}

写线程是独占的 一个线程持有写锁时 其他所有线程都要等待
泳池你在游的时候,别人也可以游 ;但是只有等没人游的时候才能放水或清洗;当在放水的时候,清洗或者游泳这些都不能再进行。

posted @ 2024-10-25 01:25  BigBosscyb  阅读(2)  评论(0)    收藏  举报