多线程15-ReaderWriterLockSlim

    class Program
    {
        static void Main()
        {
            new Thread(Read) { IsBackground = true }.Start();
            new Thread(Read) { IsBackground = true }.Start();
            new Thread(Read) { IsBackground = true }.Start();
            new Thread(Read) { IsBackground = true }.Start();
            new Thread(Read) { IsBackground = true }.Start();
            new Thread(() => Write("T1")) { IsBackground = true }.Start();
            new Thread(() => Write("T2")) { IsBackground = true }.Start();
            Thread.Sleep(TimeSpan.FromSeconds(30));
        }
        static ReaderWriterLockSlim rwl = new ReaderWriterLockSlim();
        static Dictionary<intint> items = new Dictionary<intint>();
        static void Read()
        {
            Console.WriteLine("Readind contents of a dictionary");
            while (true)
            {
                try
                {
                    rwl.EnterReadLock();
                    foreach (var item in items.Keys)
                    {
                        Thread.Sleep(TimeSpan.FromSeconds(0.1));
                        Console.WriteLine(items[item]);
                    }
                }
                finally
                {
                    rwl.ExitReadLock();
                }
            }
        }
        static void Write(string threadName)
        {
            while (true)
            {
                try
                {
                    int newKey = new Random().Next(250);
                    rwl.EnterUpgradeableReadLock();
                    if (!items.ContainsKey(newKey))
                    {
                        try
                        {
                            rwl.EnterWriteLock();
                            items[newKey] = newKey;
                            Console.WriteLine("New Key {0} is added to a dictionary by a {1}", newKey, threadName);
                        }
                        finally
                        {
                            rwl.ExitWriteLock();
                        }
                    }
                    Thread.Sleep(TimeSpan.FromSeconds(0.1));
                }
                finally
                {
                    rwl.ExitUpgradeableReadLock();
                }
            }
        }
    }
posted @ 2016-06-22 18:12  shidengyun  阅读(208)  评论(0编辑  收藏  举报