我想问几个关于在.Net中使用监视器类的问题。
要理解这些问题,请查看以下代码。
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来通知等待线程?如果需要,那么应该在退出函数之前或之后使用加号吗?
向穆巴沙尔致敬
发布于 2010-03-24 14:04:42
是的,您对监视器的使用是正确的。
也就是说,您可以使用lock语句使代码更加简洁:
public static void main(args)
{
lock(myclass)
{
}
}发布于 2010-03-24 13:42:34
获取锁,然后在finally块中释放它是正确的。我会在try块开始之前获取锁,但它可能不会造成任何伤害,除非在尝试获取锁时抛出异常。
对于你真正想要做的事情,你需要重新思考你的目标是什么。根据性能是否令人担忧,您可以查看ReaderWriterLock。如果争用较低,请考虑使用自旋锁锁定每个操作-这对于不倾向于重叠但可能重叠的操作来说是非常便宜的。
也:我认为你需要重新审视不加锁地更新集合的概念,除非你能确保只有一个线程在更新集合。
https://stackoverflow.com/questions/2505575
复制相似问题