zoukankan      html  css  js  c++  java
  • .net Monitor产生SynchronizationLockException异常的原因

    有时在使用Monitor进行并发同步编程时,会产生SynchronizationLockException异常,抛出的异常内容是"Object synchronization method was called from an unsynchronized block of code." 。意思是“对象同步方法是从非同步代码块调用的。”

    出现这个异常的原因是在相同的代码块中,Monitor的锁对象不一致。

    我们知道,Monitor一般都会使用引用对象当做锁对象。但是当Monitor的锁对象不一致时,就会抛出SynchronizationLockException异常。

    如下代码就会抛出SynchronizationLockException异常:

    protected object _locker=new object();
    protected object _lockerTmp=new object();
    
    try{
        Monitor.Enter(_locker);   
        
        //to do something 
    }
    finally{
        Monitor.Exit(_lockerTmp);
    }
    
    //在同一代码块中,如果Monitor的锁对象不一致,则会抛出SynchronizationLockException异常。
    //内容为"Object synchronization method was called from an unsynchronized block of code." 

    修改一下上面的代码,将Monitor的锁对象改为一致,就正常了。请看如下代码:

    //正常的情况
    protected static readonly object _locker=new object();
    
    try{
        Monitor.Enter(_locker);   
        
        //to do something 
    }
    finally{
        Monitor.Exit(_locker);
    }

    提醒,千万不要使用表达式体(=>)给锁对象赋值,每次调用表达式体获取的对象都不相同!

    关于表达式体(=>)和等号(=)获取值的区别请看我的另一篇随笔《.net 表达式返回值和等号赋值的区别

  • 相关阅读:
    运算符的优先级(从高到低)
    常用字符与ASCII代码对照表
    02.数据类型常量与变量
    Java基础01
    2以太坊入门的方法2
    区块链学习笔记1
    5关键字this与super的区别
    4Java中成员变量与局部变量
    lua返回页面时中文乱码
    struts2中<jsp:forward>跳转时报404错误的问题
  • 原文地址:https://www.cnblogs.com/williamwsj/p/9714844.html
Copyright © 2011-2022 走看看