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;
        }
    }
}

c#锁定库对象

下面的代码可以很好地锁定简单对象吗?答案是肯定的。

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