zoukankan      html  css  js  c++  java
  • C#中Monitor对象与Lock关键字的区别分析

    这篇文章主要介绍了C#中Monitor对象与Lock关键字的区别,需要的朋友可以参考下

    Monitor对象

    1.Monitor.Enter(object)方法是获取 锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取锁之后因为异常,致锁 无法释放,所以需要在try{} catch(){}之后的finally{}结构体中释放锁(Monitor.Exit())。
    2.Monitor的常用属性和方法:

        Enter(Object) 在指定对象上获取排他锁。
        Exit(Object) 释放指定对象上的排他锁。
        IsEntered 确定当前线程是否保留指定对象锁。
        Pulse 通知等待队列中的线程锁定对象状态的更改。
        PulseAll 通知所有的等待线程对象状态的更改。
        TryEnter(Object) 试图获取指定对象的排他锁。
        TryEnter(Object, Boolean) 尝试获取指定对象上的排他锁,并自动设置一个值,指示是否得到了该锁。
        Wait(Object) 释放对象上的锁并阻止当前线程,直到它重新获取该锁。

    Lock关键字

    1.Lock关键字实际上是一个语法糖,它将Monitor对象进行封装,给object加上一个互斥锁,A进程进入此代码段时,会给object 对象加上互斥锁,此时其他B进程进入此代码段时检查object对象是否有锁?如果有锁则继续等待A进程运行完该代码段并且解锁object对象之后,B 进程才能够获取object对象为其加上锁,访问代码段。

    2.Lock关键字封装的Monitor对象结构如下:

     代码如下:
     
                try
                {
                    Monitor.Enter(obj);
                    dosomething();
                }
                catch(Exception ex)
                {
    
                }
                finally
                {
                    Monitor.Exit(obj);
                }
     

    3.锁定的对象应该声明为private static object obj = new object();尽量别用公共变量和字符串、this、值类型。

    Monitor和Lock的区别

    1.Lock是Monitor的语法糖。
    2.Lock只能针对引用类型加锁。
    3.Monitor能够对值类型进行加锁,实质上是Monitor.Enter(object)时对值类型装箱。
    4.Monitor还有其他的一些功能。

    本文代码示例:

    代码如下:
     
        class Program
        {
            private static object obj = new object();
            public void LockSomething()
            {
                lock (obj)
                {
                    dosomething();
                }
            }
            public void MonitorSomeThing()
            {
                try
                {
                    Monitor.Enter(obj);
                    dosomething();
                }
                catch(Exception ex)
                {
    
                }
                finally
                {
                    Monitor.Exit(obj);
                }
            }
            public void dosomething()
            {
                //做具体的事情
            }
        }
    转载:https://www.cnblogs.com/cuihongyu3503319/p/5730268.html
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    LeetCode 275. H-Index II
    LeetCode 274. H-Index
    LeetCode Gray Code
    LeetCode 260. Single Number III
    LeetCode Word Pattern
    LeetCode Nim Game
    LeetCode 128. Longest Consecutive Sequence
    LeetCode 208. Implement Trie (Prefix Tree)
    LeetCode 130. Surrounded Regions
    LeetCode 200. Number of Islands
  • 原文地址:https://www.cnblogs.com/BluceLee/p/13846520.html
Copyright © 2011-2022 走看看