首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Monitor类

使用Monitor类
EN

Stack Overflow用户
提问于 2010-03-24 13:35:17
回答 2查看 763关注 0票数 3

我想问几个关于在.Net中使用监视器类的问题。

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

代码语言:javascript
复制
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来通知等待线程?如果需要,那么应该在退出函数之前或之后使用加号吗?

向穆巴沙尔致敬

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-24 14:04:42

是的,您对监视器的使用是正确的。

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

代码语言:javascript
复制
public static void main(args)
{
    lock(myclass)
    {
    }
}
票数 2
EN

Stack Overflow用户

发布于 2010-03-24 13:42:34

获取锁,然后在finally块中释放它是正确的。我会在try块开始之前获取锁,但它可能不会造成任何伤害,除非在尝试获取锁时抛出异常。

对于你真正想要做的事情,你需要重新思考你的目标是什么。根据性能是否令人担忧,您可以查看ReaderWriterLock。如果争用较低,请考虑使用自旋锁锁定每个操作-这对于不倾向于重叠但可能重叠的操作来说是非常便宜的。

也:我认为你需要重新审视不加锁地更新集合的概念,除非你能确保只有一个线程在更新集合。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2505575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档