• c# lock的使用及注意事项


    lock: 该关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。

    举例:

        单件模式

    public class Singleton
    {
        
    private static Singleton instance = null;
        
    private static readonly object syncRoot = new object();

        
    private Singleton()
        {
        }

        
    public static Singleton GetInstance()
        {
            
    if (instance == null)
            {
                
    lock (syncRoot)
                {
                    
    if (instance == null)
                    {
                        instance 
    = new Singleton();
                    }
                }
            }
            
    return instance;
        }
    }

    说明:

         单间模式中就用到了lock,是一次只能有一个实例。此例中syncRoot若为null则会抛出ArgumentNullException异常,

         所以总结如下:

         1. lock的对象不能为null;

         2. lock时如果有别的进程访问lock变量或lock{}里的内容,则不是跳过,而是等待,等待lock结束后再访问;

         3. msdn里的一句话: 

             lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被

             阻 止),直到该对象被释放;

         4. lock(this)请不要使用,this指的是整个外层方法,当锁住后导致别的进程也无法访问该方法,应lock一个不影响其他操作的私有对  

             象, 如static 的object 对象

             例如单件模式中的syncRoot ;

         5. 在使用lock的时候,被lock的对象(locker)一定要是引用类型的,如果是值类型,将导致每次lock的时候都会将该对象装箱

           为 一个新的引用对象(事实上如果使用值类型,C#编译器(3.5.30729.1)在编译时就会给出一个错误)。

  • 相关阅读:
    arguments.callee
    React成长路之--项目搭建
    JS判断页面是否被iframe及禁止页面被iframe
    flex实现常见布局
    移动端 js 实现文章的分页、翻页
    移动端开发时,搜索框聚焦时键盘出现“搜索”两字,实现友好操作
    JSON详解
    50SQL练习
    设计模式之单例模式
    Spring REST 入门教程
  • 原文地址:https://www.cnblogs.com/zjoch/p/2974749.html
Copyright © 2020-2023  润新知