有时在使用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 表达式返回值和等号赋值的区别

.net Monitor产生SynchronizationLockException异常的原因的更多相关文章

  1. NIOS II CPU复位异常的原因及解决方案

    NIOS II CPU复位异常的原因及解决方案   近期在用nios ii做项目时,发现一个奇怪的现象,在NIOS II EDS软件中编写好的代码,烧写到芯片中,第一次能够正常运行,但是当我按下板卡上 ...

  2. 查看语句运行时间异常的原因(SQLServer)

    转载:http://www.cnblogs.com/fygh/archive/2012/01/17/2324926.html 查看语句运行时间异常的原因(SQLServer)   经常有开发同事反映如 ...

  3. JDBC 异常特殊原因 (数据库只读解决办法)

    JDBC 异常特殊原因   有时候并不是因为程序写的有问题  ,是因为  数据库只读 在sqlserver2005中附加数据库时,附加的数据库会变成只读的,只能进行查询操作. 解决方法: 1 打开Sq ...

  4. 出现 org.springframework.beans.factory.BeanCreationException 异常的原因及解决方法

    1 异常描述 在从 SVN 检出项目并配置完成后,启动 Tomcat 服务器,报出如下错误: 2 异常原因 通过观察上图中被标记出来的异常信息,咱们可以知道 org.springframework.b ...

  5. Altium Designer (DXP) 复制粘贴,放器件 出错报异常的原因

    安装好Altium Designer (DXP) 09板和2013后,运行后原理图复制粘贴元件或者放心的器件后出现下面异常, 原因是: 1.未启动 Print Spooler服务 2.没有安装任何打印 ...

  6. jsp出现getOutputStream() has already been called for this response异常的原因和解决方法

    jsp出现getOutputStream() has already been called for this response异常的原因和解决方法 在tomcat5下jsp中出现此错误一般都是在js ...

  7. springboot 采用HttpClient获取天气预报 异常及原因

    采用httpClient调用天气预报地址获取出现异常 2018-10-04 15:18:25.815 ERROR 10868 --- [nio-8080-exec-5] o.a.c.c.C.[.[.[ ...

  8. Java链接Redis时出现 “ERR Client sent AUTH, but no password is set” 异常的原因及解决办法

    Java链接Redis时出现 "ERR Client sent AUTH, but no password is set" 异常的原因及解决办法 [错误提示] redis.clie ...

  9. 2019.12.11 java程序中几种常见的异常以及出现此异常的原因

    1.java.lang.NullpointerException(空指针异常) 原因:这个异常经常遇到,异常的原因是程序中有空指针,即程序中调用了未经初始化的对象或者是不存在的对象. 经常出现在创建对 ...

随机推荐

  1. linux的查找命令 find whereis locate

    Linux 有三个查找文件的命令:find, whereis, locate 其中find 不常用,whereis与locate经常使用,因为find命令速度较慢,因为whereis与locate是利 ...

  2. Java面试题整理---JVM篇

    1.JVM运行时内存区域划分?   2.内存溢出OOM和堆栈溢出SOE的案例.原因.排查及解决?   3.常用的JVM性能监控工具?   4.JVM参数设置?   5.类加载过程?   6.JVM内存 ...

  3. 软件工程实践小项目之模拟wc.exe的小程序

    github源码和工程文件地址:https://github.com/Jackchenyu/Word_counts/tree/smart 基本要求:要实现wc的基本功能即文件中字符数.单词数.行数的统 ...

  4. DataTables页面列点击排序

    <!-- DataTables --> <script type="text/javascript" charset="utf8" src=& ...

  5. ES6学习 --函数参数默认值与解构赋值默认值

    1. ES6的解构ES6中引入了解构赋值的操作,其作用是:将值从数组Array或属性从对象Object提取到不同的变量中 即分为两种情况:从数组Array中解构,以及从对象Object中解构 ①.从数 ...

  6. golang中 "下划线" 的用法

    1.忽略返回值 这个应该是最简单的用途,比如某个函数返回三个参数,但是我们只需要其中的两个,另外一个参数可以忽略,这样的话代码可以这样写: v1, v2, _ := function(...) 2.用 ...

  7. shell爬虫--抓取某在线文档所有页面

    在线教程一般像流水线一样,页面有上一页下一页的按钮,因此,可以利用shell写一个爬虫读取下一页链接地址,配合wget将教程所有内容抓取. 以postgresql中文网为例.下面是实例代码 #!/bi ...

  8. linux bash tutorial

    bash read-special-keys-in-bash xdotool linux 登录启动顺序

  9. python使用os.listdir和os.walk获得文件的路径

    python使用os.listdir和os.walk获得文件的路径   目录 情况1:在一个目录下面只有文件,没有文件夹,这个时候可以使用os.listdir 情况2:递归的情况,一个目录下面既有目录 ...

  10. Yahoo Programming Contest 2019 E - Odd Subrectangles

    E - Odd Subrectangles 思路: 对于行方案固定的情况下,假设和为奇数的列为a个,和为偶数的列为b个,a+b = m 那么从奇数里面选奇数个,即C(a, 1) + C(a, 3) + ...