4

出于好奇,我查看了lockMSDN 上的关键字:

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关键字?

4

3 回答 3

4

lock关键字不能单独存在,它总是带有一个参数,该参数将充当信号量(同步对象),只允许一个线程继续进行。

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

一次只有一个线程可以锁定同步对象(在本例中为 thisLock),并且任何竞争线程都会被阻塞,直到锁被释放。如果多个线程争用锁,它们将在“就绪队列”中排队,并以先到先得的方式授予锁(需要注意的是,Windows 和 CLR 行为的细微差别意味着公平有时可能会违反队列)。

于 2013-06-24T15:24:48.637 回答
0

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

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

于 2013-06-24T15:44:27.200 回答
0

这里有几个方面:

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

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

  • 建议使用仅用作锁定标识符的私有对象,即使可以将数据本身用作标识符。这样就没有理由在类外公开引用,因为如果在类外的锁中使用它可能会导致死锁。

于 2013-06-24T15:29:44.243 回答