Lock VS Monitor
Lock Monitor
多线程操作的时候,为防止死锁,我们经常采用加Lock的方式解决,下面就谈一下Lock的具体运用和Lock可以用什么来替换
首先,看代码:
private static object syncroot = new object();
public static void Gets()
{
lock(syncroot)
{
Console.WriteLine("sbzgw");
Console.Read();
}
}
上段代码中,是Lock的典型应用
但是,在使用Lock时候有一些注意事项:
1,Lock里面的参数必须是引用类型,不能是值类型,Lock是对象锁,否则会产生一个不同的引用类型对象,简单介绍下值类型和引用类型
值类型,参数传递的时候,把自己的值给别人复制一份,无论复制的值如何改变,不会影响原来被复制的值
引用类型,参数传递的时候,传递的内存地址,如果复制的值改变,原来的值也为改变
2, 如果类类型是public的,最好不要用Lock,因为别人都可以用,别人不知道你锁定了,如果他new一个,并且上锁,你也Lock,这时候就造成死锁了
3,如果MyType是public,不要Lock
4,永远不要Lock一个字符串
Lock在实际运用中可以用Monitor(监视器)来替换
Lock更简洁,使用更方便,可以确保即使发生异常,也可以释放基础监视器,实际上,Lock就是用Monitor来实现的,调用了finally释放资源
推荐实际使用中用Lock
Monitor是一个静态类,不能实例化,只能调用其中的方法
上面的代码可以改成下面的写法
//Monitor注意要配对使用
private static object syncroot = new object();
public static void Get2()
{
Monitor.Enter(syncroot);
try
{
Console.WriteLine("sbwgy");
Monitor.Pulse(syncroot);
}
finally
{
Monitor.Exit(syncroot);
}
Console.Read();
}
这就是Monitor替换Lock的写法
其实,感觉Lock和Monitor的关系很想.net里面的有个关键字Using,其实Using就是自动执行了Dispose方法,让我们不用担心资源的回收了,但是,不好的地方就在于,长期这么使用,或者一开始就这么用的话,我们可能并不清楚Using都替我们干了些什么事情
有点乱,就写到这里吧!
Lock VS Monitor的更多相关文章
- 线程与并发系列一:Lock、Monitor、UserSpinLock
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...
- 基础才是重中之重~lock和monitor的区别
回到目录 Monitor的介绍 1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中 ...
- lock和Monitor(锁对象)
Monitor对象 1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取 ...
- 线程同步 – lock和Monitor
在多线程代码中,多个线程可能会访问一些公共的资源(变量.方法逻辑等等),这些公共资源称为临界区(共享区):临界区的资源是不安全,所以需要通过线程同步对多个访问临界区的线程进行控制. 同样,有些时候我们 ...
- 多线程同步与并发访问共享资源工具—Lock、Monitor、Mutex、Semaphore
“线程同步”的含义 当一个进程启动了多个线程时,如果需要控制这些线程的推进顺序(比如A线程必须等待B和C线程执行完毕之后才能继续执行),则称这些线程需要进行“线程同步(thread synchro ...
- lock,Monitor,Mutex的区别
lock和Monitor的区别 一.lock的底层本身是Monitor来实现的,所以Monitor可以实现lock的所有功能. 二.Monitor有TryEnter的功能,可以防止出现死锁的问题,lo ...
- WPF MVVM UI分离之《交互与数据分离》 基础才是重中之重~delegate里的Invoke和BeginInvoke 将不确定变为确定系列~目录(“机器最能证明一切”) 爱上MVC3系列~全局异常处理与异常日志 基础才是重中之重~lock和monitor的区别 将不确定变成确定~我想监视我的对象,如果是某个值,就叫另一些方法自动运行 将不确定变成确定~LINQ DBML模型可以对
WPF MVVM UI分离之<交互与数据分离> 在我们使用WPF过程中,不可避免并且超级喜欢使用MVVM框架. 那么,使用MVVM的出发点是视觉与业务逻辑分离,即UI与数据分离 诸如下 ...
- C#多线程系列(2):多线程锁lock和Monitor
1,Lock lock 原型 lock 编写实例 2,Monitor 怎么用呢 解释一下 示例 设置获取锁的时效 C# 中,可以使用 lock 关键字和 Monitor 类来解决多线程锁定资源和死锁的 ...
- C# 队列Queue,ConcurrentQueue,BlockingCollection 并发控制lock,Monitor,信号量Semaphore
什么是队列? 队列Queues,是一种遵循先进先出的原则的集合,在.netCore中微软给我们提供了很多个类,就目前本人所知的有三种,分别是标题提到的:Queue.ConcurrentQueue.Bl ...
随机推荐
- 1014 : Trie树 hihocoder
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. ...
- ExtJS 列表数据编辑
在ExtJs中,GridPanel一般用于展示列表数据.同时利用一些附加的插件也能编辑数据.类似于asp.net中的DataGridView控件. 展示数据比较简单,利用Store则可以自动展示,只要 ...
- 关于HIVE的数据模型介绍
(1)Hive数据库 类似传统数据库的DataBase,在第三方数据库里实际是一张表.简单示例命令行 hive > create database test_database; (2)内部表 H ...
- PHPExcel(1.8.0) 帮助代码
以下代码不能直接运行,只是提供各种方法调用写法. require_once dirname(__FILE__) . '/Classes/PHPExcel.php'; $objPHPExcel = ne ...
- Eclipse配置PHP及自动提示功能
Eclipse是一个开发工具,具有强大的插件功能,虽然用于Java理所当然,但为PHP所用,也为尝不可.虽然我一直用的是notepad,但发现开发工具也可以省去一些不必要的记忆. 言归正传,下面就来实 ...
- [转]mysql drop、truncate和delete比较
一.drop table tb drop将表格直接删除,没有办法找回. 立刻释放磁盘空间 ,不管是 Innodb和MyISAM . 二.truncate (table) tb 该命令可以清空一个表里的 ...
- Java学习笔记(六)
期末课程选题:QQ登录界面.好友列表界面及聊天框界面. 功能实现:简单的功能可实现,如:点击登录进入好友列表界面:点击好友可进入聊天框:可实现简单聊天功能:聊天可输入及输出,可选择私聊或群聊,可获得当 ...
- MVC特性
MVC与ASP.NET MVC基础概念 MVC是Model-View-Controller的缩写. MVC将应用程序划分为3大组件:模型\视图\控制器. MVC不是ASP.NET所特有,它只是一种开发 ...
- PHP 表单验证
1. 验证文本框是否有内容且不能为空 <?php if (! (filter_has_var(INPUT_POST, 'flavor') && (strlen(filter_in ...
- 配置tomcat编码格式
tomcat默认编码格式为“ISO-8859-1”,打开tomcat的“server.xml”文件,找到下面行并修改 <Connector connectionTimeout="200 ...