zoukankan      html  css  js  c++  java
  • C#多线程---Monitor实现线程同步

    一、简介

    Monitor.Enter和Monitor.Exit方法来实现线程同步,这个属于排他锁,即每次只有一个线程可以访问共享数据。

    C#中通过lock关键字来提供简化的语法,lock可以理解为Monitor.Enter和Monitor.Exit方法的语法糖。

    二、例子

     1 using System;
     2 using System.Threading;
     3 
     4 namespace ThreadMonitor
     5 {
     6     class Program
     7     {
     8         private static object lockObj = new object();
     9         private static ReaderWriterLock readerwritelock = new ReaderWriterLock();
    10         static void Main(string[] args)
    11         {
    12             for (int i = 0; i < 10; i++)
    13             {
    14                 Thread testthread = new Thread(Add);
    15                 testthread.IsBackground = true;
    16                 testthread.Start();
    17             }
    18 
    19             for (int i = 0; i < 10; i++)
    20             {
    21                 Thread testthread2 = new Thread(Read);
    22                 testthread2.IsBackground = true;
    23                 testthread2.Start();
    24             }
    25             Console.WriteLine("All thread created done!");
    26             Console.Read();
    27         }
    28 
    29         // 共享资源
    30         public static int number = 1;
    31 
    32         public static void Add()
    33         {
    34       
    35             Monitor.Enter(lockObj);  //获得排他锁,每次只有一个线程可以进入
    36             Console.ForegroundColor = ConsoleColor.DarkGreen;
    37             // readerwritelock.AcquireWriterLock(50000);
    38             Console.WriteLine($"{DateTime.Now} CurrentThreadIDAdd:{Thread.CurrentThread.ManagedThreadId} CurrentValue:{number++}" );
    39             Thread.Sleep(2000);
    40             //readerwritelock.ReleaseWriterLock();
    41             // 释放指定对象上的排他锁。
    42             Console.ResetColor();
    43             Monitor.Exit(lockObj);
    44    
    45         }
    46         public static void Read()
    47         {
    48       
    49             Monitor.Enter(lockObj);      //获得排他锁
    50                                          //readerwritelock.AcquireReaderLock(50000);
    51             Console.ForegroundColor = ConsoleColor.DarkRed;
    52             Console.WriteLine($"{DateTime.Now} CurrentThreadIDRead:{Thread.CurrentThread.ManagedThreadId} CurrentValue:{number}");
    53             Thread.Sleep(2000);
    54             //readerwritelock.ReleaseReaderLock();
    55 
    56             Console.ResetColor();
    57             Monitor.Exit(lockObj);// 释放指定对象上的排他锁。
    58       
    59         }
    60     }
    61 }
    View Code

    运行结果如下:

    从结果中可以看出,无论读写线程,都会在2秒后打印出信息,也就是说只有当前的锁释放了,其他的线程才能访问共享数据。

    但实际上,我们读取数据的时候是不需要排他的。

  • 相关阅读:
    2.8
    2.7
    2.6
    2.5
    2.4第三篇读后感
    2.2第一篇读后感
    2.1
    字符统计
    6468: Snuke's Coloring
    6463: Tak and Hotels II
  • 原文地址:https://www.cnblogs.com/3xiaolonglong/p/9650136.html
Copyright © 2011-2022 走看看