xml地图|网站地图|网站标签 [设为首页] [加入收藏]

知识点总结系列,的用法与区别

来源:http://www.ccidsi.com 作者:集成经验 人气:55 发布时间:2019-05-07
摘要:3.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,那就是Monitor最常用的四个措施,当然在运用进度中为了制止获取锁之后因为1二分,致锁不恐怕自由,所以须要在try{}c

3.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,那就是Monitor最常用的四个措施,当然在运用进度中为了制止获取锁之后因为1二分,致锁不恐怕自由,所以须要在try{} catch(){}之后的finally{}结构体中释放锁(Monitor.Exit())。

  3.锁定的目的应当注脚为private static object obj = new object();尽量别用公共变量和字符串、this、值类型。

    Enter(Object) 在钦点对象上赚取排他锁。

    TryEnter(Object, Boolean) 尝试获得钦点对象上的排他锁,并自动安装二个值,提示是还是不是拿走了该锁。

    Exit(Object) 释放钦赐对象上的排他锁。

 

    TryEnter(Object, Boolean) 尝试获得钦命对象上的排他锁,并自动安装三个值,提醒是或不是获得了该锁。

  3.Monitor能够对值类型举行加锁,实质上是Monitor.Enter(object)时对值类型装箱。

lock(obj)
{
}
等价为:
try
{    
      Monitor.Enter(obj) 
}
catch()
{}
finally
{
      Monitor.Exit(obj) 
}

所以lock能做的,Monitor肯定能做,Monitor能做的,lock不一定能做。那么Monitor额外的功能呢?

还有Monitor.Wait()和Monitor.Pulse()。在lock代码里面如果调用了Monitor.Wait(),会放弃对资源的所有权,让别的线程lock进来。然后别的线程代码里Pulse一下(让原线程进入到等待队列),然后在Wait一下释放资源,这样原线程的就可以继续执行了(代码还堵塞在wait那句话呢)。

也就是说,必须两个或多个线程共同调用Wait和Pulse,把资源的所有权抛来抛去,才不会死锁。

和AutoEvent相似是处理同步关系的,但是AutoEvent是跨进程的,而Monitor是针对线程的。
以下是MSDN的代码示例,调试起来很容易看出来两个函数的作用了,因为尽管是多线程程序,但是是同步操作,所以代码始终是单步执行的。
using System;
using System.Threading;
using System.Collections;

namespace MonitorCS1
{
    class MonitorSample
    {
        const int MAX_LOOP_TIME = 100;
        Queue m_smplQueue;

        public MonitorSample()
        {
            m_smplQueue = new Queue();
        }
        public void FirstThread()
        {
            int counter = 0;
            lock (m_smplQueue)
            {
                while (counter < MAX_LOOP_TIME)
                {
                    //Wait, if the queue is busy.
                    Monitor.Wait(m_smplQueue);
                    //Push one element.
                    m_smplQueue.Enqueue(counter);
                    //Release the waiting thread.
                    Monitor.Pulse(m_smplQueue);

                    counter  ;
                }
                int i = 0;
            }
        }
        public void SecondThread()
        {
            lock (m_smplQueue)
            {
                //Release the waiting thread.
                Monitor.Pulse(m_smplQueue);
                //Wait in the loop, while the queue is busy.
                //Exit on the time-out when the first thread stops.
                while (Monitor.Wait(m_smplQueue, 50000))
                {
                    //Pop the first element.
                    int counter = (int)m_smplQueue.Dequeue();
                    //Print the first element.
                    Console.WriteLine(counter.ToString());
                    //Release the waiting thread.
                    Monitor.Pulse(m_smplQueue);
                }
            }
        }
        //Return the number of queue elements.
        public int GetQueueCount()
        {
            return m_smplQueue.Count;
        }

        static void Main(string[] args)
        {
            //Create the MonitorSample object.
            MonitorSample test = new MonitorSample();
            //Create the first thread.
            Thread tFirst = new Thread(new ThreadStart(test.FirstThread));
            //Create the second thread.
            Thread tSecond = new Thread(new ThreadStart(test.SecondThread));
            //Start threads.
            tFirst.Start();
            tSecond.Start();
            //wait to the end of the two threads
            tFirst.Join();
            tSecond.Join();
            //Print the number of queue elements.
            Console.WriteLine("Queue Count = "   test.GetQueueCount().ToString());
        }
    }
}

参考

 http://blog.sina.com.cn/s/blog_57a829dd01010zyp.html
                                       Lock关键字

一.lock的平底本人是Monitor来落到实处的,所以Monitor能够达成lock的有所功效

  二.Lock人命关天字封装的Monitor对象组织如下:

二.Monitor有TryEnter的效率,能够幸免出现死锁的难题,lock未有。

  一.Lock要害字实在是1个语法糖,它将Monitor对象开始展览打包,给object加上1个互斥锁,A进度进入此代码段时,会给object对象加上互斥锁,此时别的B进度进入此代码段时检查object对象是还是不是有锁?假若有锁则继续等待A进度运维完该代码段并且解锁object对象之后,B进程工夫够得到object对象为其增加锁,访问代码段。

    IsEntered 分明当前线程是还是不是保留钦命对象锁。

  Monitor对象

    PulseAll 通告全部的守候线程对象景况的转移。

  四.Monitor还有任何的一些作用。

四.Monitor的常用属性和章程:

    Exit(Object) 释放钦点对象上的排他锁。

    Wait(Object) 释放对象上的锁并阻止当前线程,直到它再一次猎取该锁。

  壹.Lock是Monitor的语法糖。

    Pulse 通告等待队列中的线程锁定目的意况的转移。

  二.Monitor的常用属性和艺术:

本文由68399皇家赌场发布于集成经验,转载请注明出处:知识点总结系列,的用法与区别

关键词: 68399皇家赌场

上一篇:如何使用jquery,框架搭建记录

下一篇:没有了

最火资讯