有时在使用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. mysql----------mysql5.7.11导入sql文件时报错This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled

    1.导入sql文件出现如下错误. [Err] 1418 - This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in ...

  2. 数据模型model设置、生成数据迁移文件、执行数据迁移文件

    一.model的配置 1.创建数据库 2.安装pymysql 3.修改配置文件 数据库连接配置 DATABASES = {'default': {'ENGINE': 'django.db.backen ...

  3. 20165215 MySort的实现

    MySort的实现 要求 模拟实现Linux下Sort -t : -k 2的功能 要有伪代码,产品代码,测试代码(注意测试用例的设计) import java.util.*; public class ...

  4. DUBBO分布式入门

    Dubbox框架简介: Dubbox是一个分布式服务框架,其前身是阿里巴巴开源项目Dubbo,被国内电商及互联网项目广泛使用,但是后阿里巴巴对该项目停止维护了,当当网后来组建了一个团队一直维护Dubb ...

  5. Electron: 从零开始写一个记事本app

    Electron介绍 简单来说,Electron就是可以让你用Javascript.HTML.CSS来编写运行于Windows.macOS.Linux系统之上的桌面应用的库.本文的目的是通过使用Ele ...

  6. Got error -1 when reading table

    环境:Percona Server for MySQL 5.5.18 模拟三个Terminal,实现当引用锁定表的查询被杀死时,错误日志中出现的Got error -1 when reading ta ...

  7. Linux 查看磁盘使用情况

    Linux 查看磁盘使用情况 df 查看当前挂载空间使用情况 语法: df [选项]... [FILE]... 文件-a, --all 包含所有的具有 0 Blocks 的文件系统 文件--block ...

  8. 一、restful规范 二、CBV(View)源代码执行流程 三、drf框架安装和简单使用

    一.restful规范 ''' 它是一个规范,面向资源架构 十条规范 1.API与用户的通讯协议,总是使用HTTPs协议,确保了网络传输的安全性 2.域名 --https://api.example. ...

  9. Win32汇编学习(7):鼠标输入消息

    这次我们将学习如何在我们的窗口过程函数中处理鼠标按键消息.例子演示了如何等待鼠标左键按下消息,我们将在按下的位置显示一个字符串. 理论: 和处理键盘输入一样,WINDOWS将捕捉鼠标动作并把它们发送到 ...

  10. PHP isset 和 array_key_exists 对比

    经常使用 isset 判断变量或数组中的键是否存在,但是数组中可以使用 array_key_exists 这个函数,那么这两个 哪一个更优呢? 官方文档这样定义两者: isset:语言构造器,用于检测 ...