1)Mutex:进程之间的同步(互斥量)。

2)lock/Monitor……:线程同步。其中lock是Monitor的简化版本(直接生成try{Monitor.Enter(……)}finally{Monitor.Exit(……);}方法。

当然,Monitor还有Pulse方法,该方法对于锁定同一个对象的时候,允许其它线程进入准备区,同时配合Wait方法(Wait将自己暂时退出)。某种情况下可以代替信号量(ManualResetEvent),考察以下例子(来源:http://bbs.csdn.net/topics/380095508):

class MyManualEvent
{
private object lockObj = new object();
private bool hasSet = false; public void Set()
{
lock (lockObj) //排队准备领到开锁的钥匙
{
hasSet = true;
Monitor.PulseAll(lockObj); //通知其他排队人先拿钥匙开锁
}
}
public void WaitOne()
{
lock (lockObj) //排队准备领取开锁的钥匙
{
while (!hasSet)
{
Monitor.Wait(lockObj); //等通知,这样可以拿到钥匙开锁了
}
}
}
}
class Program
{
static MyManualEvent myManualEvent = new MyManualEvent();
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(WorkerThread, "A");
ThreadPool.QueueUserWorkItem(WorkerThread, "B");
Console.WriteLine("Press enter to signal the green light");
Console.ReadLine();
myManualEvent.Set();
ThreadPool.QueueUserWorkItem(WorkerThread, "C");
Console.ReadLine();
}
static void WorkerThread(object state)
{
myManualEvent.WaitOne();
Console.WriteLine("Thread {0} got the green light...", state);
}
}

3)MethodImpl:是一个特性,在System.Runtime.CompilerServices下,等同于lock。在作用于一个类方法的时候=lock(this),作用于一个静态方法等同于lock(typeof(某个类))。

4)SynchronizedAttribute(在System.Runtime.Remoting.Contexts命名空间下)。用于多个程序域实例化某个类,使得该类的数据和方法都可以被同步(单个程序域也可以)。

值得注意的是:WaitHandler的WaitOne方法第二个参数在这里起作用。

示例代码:

namespace ConsoleApplication1
{
[Synchronization(true)]
class My:ContextBoundObject
{
static void Main(string[] args)
{
My my = new My();
ThreadPool.QueueUserWorkItem(my.FuncA);
ThreadPool.QueueUserWorkItem(my.FuncA); Console.ReadLine();
} AutoResetEvent myEvent = new AutoResetEvent(false); public void FuncA(object state)
{
Console.WriteLine("Thread id is:"+Thread.CurrentThread.ManagedThreadId);
myEvent.WaitOne(, false); //改成true你发现会有第二个线程突然插入并执行
Console.WriteLine("=======");
}
}
}

Mutex,Monitor,lock,MethodImplAttribute,SynchronizedAttribute的用法差异的更多相关文章

  1. 关于boost的thread的mutex与lock的问题

    妈的,看了好久的相关的知识,感觉终于自己有点明白了,我一定要记下来啊,相关的知识呀.... 1, 也可以看一下boost的线程指南:http://wenku.baidu.com/link?url=E_ ...

  2. boost库中thread多线程详解2——mutex与lock

    1. mutex对象类 mutex类主要有两种:独占式与共享式的互斥量.▲ 独占式互斥量:mutex: 独占式的互斥量,是最简单最常用的一种互斥量类型try_mutex: 它是mutex的同义词,为了 ...

  3. 第29课 互斥量与自解锁(std::mutex和lock系列)

    一. 互斥量 (一)Mutex系列类 1. std::mutex:独占的互斥量,不能递归使用. 2. std::recursive_mutex:递归互斥量.允许同一线程多次获得该互斥锁,可以用来解决同 ...

  4. Mutex 和 Lock

    #include <future> #include <mutex> #include <iostream> #include <string> #in ...

  5. Matlab神经网络函数newff()新旧用法差异

    摘要 在Matlab R2010a版中,如果要创建一个具有两个隐含层.且神经元数分别为5.3的前向BP网络,使用旧的语法可以这样写: net1 = newff(minmax(P), [5 3 1]); ...

  6. Synchronize 和 Lock 的区别与用法

    一.synchronized和lock的用法区别 (1)synchronized(隐式锁):在需要同步的对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要 ...

  7. Java synchronized和 Lock 的区别与用法

    在分布式开发中,锁是线程控制的重要途径.Java为此也提供了2种锁机制,synchronized和lock.做为Java爱好者,自然少不了对比一下这2种机制,也能从中学到些分布式开发需要注意的地方.  ...

  8. Synchronized和lock的区别和用法

    一.synchronized和lock的用法区别 (1)synchronized(隐式锁):在需要同步的对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要 ...

  9. 深入研究 Java Synchronize 和 Lock 的区别与用法

    在分布式开发中,锁是线程控制的重要途径.Java为此也提供了2种锁机制,synchronized和lock.做为Java爱好者,自然少不了对比一下这2种机制,也能从中学到些分布式开发需要注意的地方.  ...

随机推荐

  1. phpize命令在安装AMQP插件是报错phpize:Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF envir的解决方法

    phpize命令在安装AMQP插件是报错phpize:Cannot find autoconf. Please check your autoconf installation and the $PH ...

  2. replaceState 实现返回从新定位

    在web 开发中,选择列表分类,在中商品, 详情页面后,返回的时候我们想定位到原来选择的分类 就需要借助window.history.replaceState来实现 function getProdu ...

  3. Android-Spinner下拉列表

    在布局Layout文件中定义Spinner: <?xml version="1.0" encoding="utf-8"?> <LinearLa ...

  4. Android-ListView-(BaseAdapter初步)

    在Android中就提供了专门列表显示条目的控件,ListView控件,ListView控件不是一次性加载全部数据,他是只加载用户在屏幕看得到的数据,当用户滑动的过程中在去加载新的数据,同时会自动销毁 ...

  5. 设置ArcGIS地图文档的数据源为相对路径

    ArcGIS中默认情况下,地图文档的数据源路径为绝对路径.在这种情况下,如果移动/拷贝地图文档及其数据源后,再次打开地图文档时,就看不到具体图层数据了(图层列表中图层前有“!”图标,并且无法查看图层数 ...

  6. 纯分享scp协议如何工作

    scp协议是什么, wiki上说: Secure copy or SCP is a means of securely transferring computer files between a lo ...

  7. Replication--复制笔记1

    1.快照复制和事务复制使用分发代理传递文件,而合并复制使用合并代理来传递文件2.快照代理在分发服务器上运行3.在创建快照是,根据复制的类型对发布表的加锁方式而不同    a)对应合并发布,快照代理不适 ...

  8. 反省在北京某S2B2C电商小型公司面试时掉链子的问题

    昨天,参与北京一家公司面试时,不知道为什么,错了很多题,这些题在该家公司之前已经被问很多次了,当天精神恍惚的没答上来或答错,被问到数据库优化和乐观锁的问题,首先我谈到了存储引擎底层的数据结构 B树/B ...

  9. TestNG+Selenium

    是一个开源自动化测试框架.其实类似于JUnit这种单元测试框架,但进行了一些功能扩展 属于selenium?还是说TestNG是一个测试框架,它用到了selenium的web自动化测试的功能,比如使用 ...

  10. python学习之路 一 :编程语言介绍

    本节重点 理解编程语言是什么? 大体明白,编程语言是如何与计算机底层通信的编程语言有哪些分类? 分别列举主流编程语言的特点 什么是编程,为什么要编程 一.什么是编程语言?为什么要编程? 编程:是个动词 ...