• C# Monitor:锁定资源


    C# Monitor:锁定资源

    在 C# 中 Monitor 类的命名空间是 System.Threading,它的用法要比《C# lock》一节中介绍的 lock 的用法复杂一些,但本质是一样的。

    使用 Monitor 类锁定资源的代码如下

    Monitor.Enter(object);
    try
    {
        //临界区代码
    }
    finally
    {
        Monitor.Exit(object);
    }

    在这里,object 值与 lock 中的 object 值是一样的。

    简而言之,lock 的写法是 Monitor 类的一种简写。

    【实例】将上一节《C# lock》实例中的 lock 关键字替换成 Monitor 类。

    根据题目要求,代码如下。

    
     
    1. class Program
    2. {
    3. public void PrintEven()
    4. {
    5. Monitor.Enter(this);
    6. try
    7. {
    8. for(int i = 0; i <= 10; i = i + 2)
    9. {
    10. Console.WriteLine(Thread.CurrentThread.Name + "--" + i);
    11. }
    12. }
    13. finally
    14. {
    15. Monitor.Exit(this);
    16. }
    17. }
    18. public void PrintOdd()
    19. {
    20. Monitor.Enter(this);
    21. try
    22. {
    23. for(int i = 1; i <= 10; i = i + 2)
    24. {
    25. Console.WriteLine(Thread.CurrentThread.Name + "--" + i);
    26. }
    27. }
    28. finally
    29. {
    30. Monitor.Exit(this);
    31. }
    32. }
    33. static void Main(string[] args)
    34. {
    35. Program program = new Program();
    36. ThreadStart ts1 = new ThreadStart(program.PrintOdd);
    37. Thread t1 = new Thread(ts1);
    38. t1.Name = "打印奇数的线程";
    39. t1.Start();
    40. ThreadStart ts2 = new ThreadStart(program.PrintEven);
    41. Thread t2 = new Thread(ts2);
    42. t2.Name = "打印偶数的线程";
    43. t2.Start();
    44. }
    45. }

    运行该程序,效果如下图所示。
     


    Monitor 类的用法虽然比 lock 关键字复杂,但其能添加等待获得锁定的超时值,这样就不会无限期等待获得对象锁。

    使用 TryEnter() 方法可以给它传送一个超时值,决定等待获得对象锁的最长时间。

    使用 TryEnter() 方法设置获得对象锁的时间的代码如下。

    Monitor.TryEnter(object, 毫秒数 );

    该方法能在指定的毫秒数内结束线程,这样能避免线程之间的死锁现象。

    此外,还能使用 Monitor 类中的 Wait() 方法让线程等待一定的时间,使用 Pulse() 方法通知处于等待状态的线程。

  • 相关阅读:
    JSON、JSONObject、JavaBean三者的相互转换
    Redis下载安装及设置密码
    Git撤销已经提交的 commit
    SpringBoot文件上传、删除及下载
    JavaScript 获取当前系统时间(精确到天)
    Python搭建简易HTTP服务(3.x版本和2.x版本的)
    20151017第一天
    js知识点: 数组
    jQuery事件委托方法 bind live delegate on
    数组去重的方法
  • 原文地址:https://www.cnblogs.com/grj001/p/12223757.html
Copyright © 2020-2023  润新知