• 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秒后打印出信息,也就是说只有当前的锁释放了,其他的线程才能访问共享数据。

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

  • 相关阅读:
    synchronized锁升级的过程(偏向锁到轻量锁再到重量级锁)转
    sprin 事务注解@Transactional的实现原理(转)
    springboot + redis + 注解 + 拦截器 实现接口幂等性校验(转)
    JAVA-TCP
    oracle查看连接信息
    C# 计算两个字符的相似度
    Java设计模式桥接模式
    C# Newtonsoft.Json.JsonReaderException:“Could not convert string to decimal:
    java设计模式结构型模式
    Java设计模式原型模式
  • 原文地址:https://www.cnblogs.com/3xiaolonglong/p/9650136.html
Copyright © 2020-2023  润新知