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. apache mina2.0源码解析(一)

    apache mina是一个基于java nio的网络通信框架,为TCP UDP ARP等协议提供了一致的编程模型:其源码结构展示了优秀的设计案例,可以为我们的编程事业提供参考. 依照惯例,首先搭建a ...

  2. codeforces 914E Palindromes in a Tree(点分治)

    You are given a tree (a connected acyclic undirected graph) of n vertices. Vertices are numbered fro ...

  3. POJ 3660 Cow Contest(传递闭包)

    N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a programming contest. As we ...

  4. C# 调用带输入输出参数的存储过程

    //调用存储过程执行类似于2//select count(*) from userinfo where username=username and pwd=pwd and grade=grade3// ...

  5. union 和 all union

    sql union用法和sql union all用法,sql union效率 1.sql union用法 sql union在查询中可以将两个SQL 语句的结果合并起来.如果这样看的话, UNION ...

  6. Oracle觸發器調用procedure寄信

    最近寫了一直Web Service給很多不同站的客戶端呼叫,并直接寄信通知程式中的異常. 直接在oracle中設置某張表的trigger(after insert),當有新的異常資料寫入時候,寄給相關 ...

  7. TDE--相关Demo

    SQL Server 2008引入透明数据加密(Transparent Data Encryption),它允许你完全无需修改应用程序代码而对整个数据库加密.当一个用户数据库可用且已启用TDE时,在写 ...

  8. Android Camera开发经验总结以及踩过的那些坑

    写在开头 需求方:上传试卷的时候,用户自己拍的照片有很多问题.如:不清晰.图片歪了.错误图片等.我们要是能够对拍摄照片进行识别处理就好了,能够裁切矫正就更好了,最好可以像二维码扫描一样,直接识别处理- ...

  9. 6.iptables常用规则

    开启ip段192.168.1.0/24端的80口 开启ip段211.123.16.123/24端ip段的80口 # iptables -I INPUT -p tcp --dport 80 -j DRO ...

  10. ArchLinux pacman 提高俩倍下载速度方法

    pacman能够调用外部下载工具来代替默认的wget来给pacman提速 比如将/etc/pacman.conf中 XferCommand = /usr/bin/wget –passive-ftp - ...