• 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("=======");
            }
        }
    }
  • 相关阅读:
    SQLite打开提示database disk image is malformed
    windows查看端口占用
    新浪SAE使用Thinkphp框架,禁用memcache节省豆子的方法
    Realtek 8168 安装 VMware ESXi 提示没有驱动
    13年国庆彩蛋
    Flex使用宋体渲染越南语显示错误
    微信 编码要UTF8
    WeiXin 验证成为开发者和更换服务器验证代码
    测试网络连通情况
    废弃sqlite代码,备查
  • 原文地址:https://www.cnblogs.com/ServiceboyNew/p/4220766.html
Copyright © 2020-2023  润新知