应用程序中的所有线程都可以访问方法中的公用字段。要同步对公用字段的访问,您可以使用属性替代字段,并使用 ReaderWriterLock 对象控制访问。为此,请按照下列步骤操作:

using System;
using System.Threading;

namespace MultiThreadApplication
{
    
class Class1
    
{
        
private ReaderWriterLock rwl = new ReaderWriterLock();
        
private long myNumber;
        
public long Number   // the Number property
        {
            
get
            
{
                
//Acquire a read lock on the resource.
                rwl.AcquireReaderLock(Timeout.Infinite);
                
try
                
{
                    Console.WriteLine(
"Thread:{0} starts getting the Number", Thread.CurrentThread.GetHashCode());
                    Thread.Sleep(
50);
                    Console.WriteLine(
"Thread:{0} got the Number", Thread.CurrentThread.GetHashCode());

                }

                
finally
                
{
                    
//Release the lock.
                    rwl.ReleaseReaderLock();
                }

                
return myNumber;
            }

            
set
            
{
                
//Acquire a write lock on the resource.
                rwl.AcquireWriterLock(Timeout.Infinite);
                
try
                
{
                    Console.WriteLine(
"Thread: {0} start writing the Number", Thread.CurrentThread.GetHashCode());
                    Thread.Sleep(
50);
                    myNumber 
= value;
                    Console.WriteLine(
"Thread: {0} written the Number", Thread.CurrentThread.GetHashCode());
                }

                
finally
                
{
                    
//Release the lock.
                    rwl.ReleaseWriterLock();
                }

            }

        }


        [STAThread]
        
static void Main(string[] args)
        
{
            Thread[] threadArray 
= new Thread[20];
            
int threadNum;


            Class1 Myclass 
= new Class1();
            ThreadStart myThreadStart 
= new ThreadStart(Myclass.AccessGlobalResource);

            
//Create 20 threads.
            for (threadNum = 0; threadNum < 20; threadNum++)
            
{
                threadArray[threadNum] 
= new Thread(myThreadStart);
            }


            
//Start the threads.
            for (threadNum = 0; threadNum < 20; threadNum++)
            
{
                threadArray[threadNum].Start();
            }


            
//Wait until all the thread spawn out finish.
            for (threadNum = 0; threadNum < 20; threadNum++)
                threadArray[threadNum].Join();

            Console.WriteLine(
"All operations have completed. Press enter to exit");
            Console.ReadLine();
        }


        
public void AccessGlobalResource()
        
{
            Random rnd 
= new Random();
            
long theNumber;

            
if (rnd.Next() % 2 != 0)
                theNumber 
= Number;
            
else
            
{
                theNumber 
= rnd.Next();
                Number 
= theNumber;
            }


        }

    }

}



说明了读写共享资源访问是不冲图的,如下图所示(这个方式解决了多个线程可同时读,只有一个线程可以定的操作的协调)ScreenCap.jpg
原文地址:https://www.cnblogs.com/snowball/p/388282.html