多線程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();                 }             }         }     }
相關文章
相關標籤/搜索