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. redis整理の走进redis世界

    声明:原文摘自http://weibo.com/u/2446082491,谢谢他的分享! 在当前大型互联网应用以及提供云计算服务的时候,怎样保证系统在海量数据环境下的高性 能.高可靠性.高扩展性.高可 ...

  2. ArcGIS Runtime SDK for Android 授权(arcgis android 去除水印)

    ArcGIS Runtime SDK for Android 授权 ESRI中国北京 要下载和安装 ArcGIS Runtime SDK for Android,您需要注册开发者账户,进而便拥有了访问 ...

  3. commons工具类

    转自:https://blog.csdn.net/leaderway/article/details/52387925 1.1. 开篇 在Java的世界,有很多(成千上万)开源的框架,有成功的,也有不 ...

  4. VMware Workstation内存不足问题的解决!

    我今天使用VMware Workstation,遇到内存使用不足的问题,我使用的VMware Workstation是9,刚开始我以为是我的VMware Workstation版本低,所以上网找到了V ...

  5. 910. Smallest Range II

    Given an array A of integers, for each integer A[i] we need to choose either x = -K or x = K, and ad ...

  6. kali linux之Msf

    目前最流行,最强大,最具扩展性的渗透测试平台软件 基于metasploit进行渗透测试和漏洞分析的流程和方法 框架集成了渗透测试标准(PETS)思想 一定程度上统一了渗透测试和漏洞研究的工作环境 新的 ...

  7. 如何实现 Python 中 selnium 模块的换行

    如何实现 Python 中 selnium 模块的换行 三种方法: 直接调用 .submit() 方法,常使用在用户密码登录中 # driver.find_element_by_xpath('//*[ ...

  8. shell 常用命令集合

    grep -i 忽略大小写 -I 跳过二进制文件 -c 计算数量 -n 显示行号 -R 递归 -v 不匹配某个关键字 常用组合命令 grep -iIRn keyword * 搜索含有该 keyword ...

  9. Establishing SSL connection without server's identity verification is not recommended.

    完全描述:Establishing SSL connection without server's identity verification is not recommended. Accordin ...

  10. chrome cpu占用100%

    参考原文地址:https://stackoverflow.com/questions/20276097/chrome-devtools-100-cpu 问题描述,chrome打开devtools开发者 ...