使用Monitor类

时间:2010-03-24 05:35:17

标签: .net synchronization locking

我想问几个关于在.Net中使用Monitor Class的问题。

要了解这些问题,请查看以下代码。

public class MyClass
{
    private List<int> _MyCollection = new List<int>();

    public void GetLock()
    {
        Monitor.Enter(_MyCollection);
    }

    public void ReleaseLock()
    {
        Monitor.Exit(_MyCollection);
    }

    public void UpdateCollection(/*anyparam*/)
    {
        //update collection without lock on collection
    }
}

public class MyAppMain
{
    private static MyClass myclass = new MyClass();

    public static void main(args)
    {
        try
        {
            myclass.GetLock();

            //an operation that does not do any update on myclass but wanted 
            //to ensure that the collection within myclass never update
            //while its doing following opetion

            //Do somthing
        }
        finally
        {
            myclass.ReleaseLock();
        }
    }
}

现在这是监视器的正确使用,我是否需要使用Pulse或PulseAll来发出等待线程的信号,如果是,则应该在Exit函数之前或之后使用加号?

此致 Mubashar

2 个答案:

答案 0 :(得分:2)

获取锁定然后在finally块中释放它是正确的。我会在try块启动之前获得锁定,但除非尝试获取锁定而抛出异常,否则它可能不会造成任何损害。

对于您实际想要做的事情,您需要重新考虑您的目标是什么。根据性能是否值得关注,您可以查看ReaderWriterLock。如果争用率很低,请考虑锁定每个操作,但使用自旋锁 - 这对于不会重叠但可能不会重叠的操作来说非常便宜。

另外:我认为你需要重新审视更新集合而不锁定的概念,除非你能确保只有一个线程会更新集合。

答案 1 :(得分:2)

是的,您对Monitor的使用是正确的。

也就是说,您可以使用lock语句使代码更简洁:

public static void main(args)
{
    lock(myclass)
    {
    }
}