zoukankan      html  css  js  c++  java
  • 应用程序中的所有线程都可以访问方法中的公用字段。要同步对公用字段的访问,您可以使用属性替代字段,并使用 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
  • 相关阅读:
    9.8
    9.6
    9.5
    树状数组
    逆序对
    tab标签切换(无炫效果,简单的显示隐藏)
    JQuery 的选择器
    简单的JQuery top返回顶部
    Hello Word!
    java Data 计算自己活了多少天
  • 原文地址:https://www.cnblogs.com/snowball/p/388282.html
Copyright © 2011-2022 走看看