c#锁定库对象
本文关键字:对象 锁定 | 更新日期: 2023-09-27 18:08:36
下面的代码可以很好地锁定简单对象吗?
如果是,为什么没有更多地使用/如何改进?如果不是,为什么不呢?
public class Vault<T>
{
private object key = new object();
private T _Item;
public Vault() { }
public Vault(T Deposit)
{
Set(Deposit);
}
public T Get()
{
lock (key)
{
return _Item;
}
}
public void Set(T Deposit)
{
lock (key)
{
_Item = Deposit;
}
}
}
下面的代码可以很好地锁定简单对象吗?答案是肯定的。
lock语句是Monitor的c#语法糖。输入并监控。退出在这个答案的时刻,你可以看到这个类并没有过时,也许这可以回答你的问题:那么为什么它不被更多地使用 .作为参考,你可以看到MSDN监视器类。锁语句的开销是20ns
只是几个注释,如果在你的锁语句中抛出一个异常,如果你不考虑围绕锁的try-catch,这可能是有害的,一个复杂情况的解决方案是"回滚"。在下面的示例中,如果抛出异常,您可能会损失金钱。
public void Set(T Deposit)
{
lock (key)
{
_Item -= Deposit/x; x can take the value of zero
}
}
对于您的改进,请考虑try-catch为了避免这个问题。
如果你想直接使用Monitor类。Enter有一个额外的参数ref bool lockTaken,它可以很有用,正确的使用模式是(这正是c# 4.0转换锁语句的方式)
bool lockTaken = false;
try
{
Monitor.Enter (_locker, ref lockTaken);
// Do your stuff...
}
finally { if (lockTaken) Monitor.Exit (_locker); }
你可以阅读更多关于锁在这里Albahari