net 多线程 学习 07 ReaderWriterLockSlim 读写锁

ReaderWriterLockSlim

使用读写锁来保护多线程共同访问的静态变量。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ReaderWriterlocks
{
    class Program
    {
        static ReaderWriterLockSlim readerWriterLockSlim = new ReaderWriterLockSlim();
        // a static variable that's shared among threads, so we need to use read write lock to make sure the data is not messed up
        static Dictionary<int, string> persons = new Dictionary<int, string>();
        static Random random = new Random();
        static void Main(string[] args)
        {
            var task1 = Task.Factory.StartNew(Read);
            var task2 = Task.Factory.StartNew(Write, "raymond");
            var task3 = Task.Factory.StartNew(Write, "msft");
            var task4 = Task.Factory.StartNew(Read);
            var task5 = Task.Factory.StartNew(Read);
            Task.WaitAll(task1, task2, task3, task4, task5);
            Console.Read();
        }

        static void Read()
        {
            for (int i = 0; i < 10; i++)
            {
                readerWriterLockSlim.EnterReadLock(); // read lock
                Thread.Sleep(50);
                readerWriterLockSlim.ExitReadLock();
            }
        }

        static void Write(object user)
        {
            for (int i = 0; i < 10; i++)
            {
                int id = GetRandom();
                readerWriterLockSlim.EnterWriteLock(); // write lock
                var person = "Person " + i;
                persons.Add(id, person);
                readerWriterLockSlim.ExitWriteLock();
                Console.WriteLine(user + " added " + person);
                Thread.Sleep(250);
            }
        }

        static int GetRandom()
        {
            lock (random)
            {
                return random.Next(2000, 5000);
            }
        }
    }
}


第二个例子


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace AcquireWriterLockDemo
{
    class Program
    {
            static ReaderWriterLock rwlock = new ReaderWriterLock();

            static void Main(string[] args)
            {
                //比如开启5个task
                for (int i = 0; i < 5; i++)+
                {
                    Task.Factory.StartNew(() =>
                    {
                        Read();
                    });
                }
                Task.Factory.StartNew(() =>
                {
                    Write();
                });

                Console.Read();
            }

            static int nums = 0;

            /// <summary>
            /// 线程读
            /// </summary>
            static void Read()
            {
                while (true)
                {
                    Thread.Sleep(10);
										//获得锁
                    rwlock.AcquireReaderLock(int.MaxValue);
                    Thread.Sleep(10);
                    Console.WriteLine("当前 t={0} 进行读取 {1}", Thread.CurrentThread.ManagedThreadId, DateTime.Now);
                    rwlock.ReleaseReaderLock();
                }
            }

            /// <summary>
            /// 线程写
            /// </summary>
            static void Write()
            {
                while (true)
                {
                    //3s进行一次写操作
                    Thread.Sleep(3000);
                    rwlock.AcquireWriterLock(int.MaxValue);
                    Thread.Sleep(30000);
                    Console.WriteLine("当前 t={0} 进行写入。。。。。。。。。。。。。。。。。。。。。。。{1}", Thread.CurrentThread.ManagedThreadId, DateTime.Now);
                    rwlock.ReleaseWriterLock();
                }
            }
        }
}



作者:spike

分类: Net

创作时间:2023-06-25

更新时间:2024-12-09

联系方式放在中括号之中例如[[email protected]],回复评论在开头加上标号例如:#1