zoukankan      html  css  js  c++  java
  • Mutex,Monitor,lock,MethodImplAttribute,SynchronizedAttribute的用法差异

    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(2000, false);   //改成true你发现会有第二个线程突然插入并执行
                Console.WriteLine("=======");
            }
        }
    }
  • 相关阅读:
    JAVA文件操作类和文件夹的操作代码示例
    java去除表达符号的正则表达式
    正则表达式以过滤特殊字符
    eclipse与myeclipse恢复已删除的文件和代码
    Windows 2003 Server R2 x64 IIS6.0 eWebEditor无法显示的问题
    获得每日,每周,每月的0点和24点的时间戳
    Access查询时间段 .
    java连接Access数据库的两种方法
    移动App专项测试
    linux性能评估-内存基础理解篇
  • 原文地址:https://www.cnblogs.com/ServiceboyNew/p/4220766.html
Copyright © 2011-2022 走看看