为什么需要冗余锁定对象?

时间:2013-06-24 15:22:22

标签: c# multithreading locking

出于好奇,我们正在查看MSDN上的lock关键字:

class Account
{
    decimal balance;
    private Object thisLock = new Object();

    public void Withdraw(decimal amount)
    {
        lock (thisLock)
        {
            if (amount > balance)
            {
                throw new Exception("Insufficient funds");
            }
            balance -= amount;
        }
    }
}

在上面的示例中,对象thisLocklock关键字一起使用。为什么需要这个?它似乎没有任何其他目的。为什么不单独使用lock关键字?

3 个答案:

答案 0 :(得分:4)

lock关键字本身不存在,它总是需要一个参数作为信号量(同步对象),只允许一个线程继续。

http://www.albahari.com/threading/part2.aspx#_Locking

  

只有一个线程可以锁定同步对象(在这种情况下,   thisLock)一次,任何竞争线程都被阻塞,直到锁被释放。如果多个线程争用锁,它们就是   在“就绪队列”上排队并按先到先行锁定,   先到先得(一个警告是,行为的细微差别   Windows和CLR有时意味着队列的公平性   被侵犯)。

答案 1 :(得分:0)

这里有几个方面:

  • lock语句需要一个对象引用作为标识符。它必须具有标识此锁的东西,并将其与代码中可能存在的任何其他锁分开。

  • 您要保护的数据不是引用类型,因此您需要使用其他内容作为锁定的标识符。

  • 建议使用仅用作锁定标识符的私有对象,即使可以使用数据iself作为标识符也是如此。这样就没有理由在类外面公开引用,因为如果它被用在类外的锁中,就会打开可能的死锁。

答案 2 :(得分:0)

用于锁定的对象不是多余的。该对象充当令牌,用于实现简单的同步协议:持有锁的任何人都被授予对锁定代码的访问权限。所有其他人都必须等到锁被释放。

如果没有对象,就不可能拥有不同的令牌,并且所有同步都依赖于单个内部令牌。这不会很有效。