4

好奇心からlock、MSDN のキーワードを見ていました。

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キーワードは単独では存在できません。常に、セマフォ (同期オブジェクト) として機能するパラメーターを取り、1 つのスレッドのみが続行できるようにします。

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

一度に 1 つのスレッドのみが同期オブジェクト (この場合は thisLock) をロックでき、競合するスレッドはロックが解除されるまでブロックされます。複数のスレッドがロックを競合する場合、それらは「レディ キュー」に入れられ、先着順でロックが付与されます (Windows と CLR の動作のニュアンスにより、公平性が失われることを意味することに注意してください)。キューの違反が発生する場合があります)。

于 2013-06-24T15:24:48.637 に答える
0

ロックに使用されるオブジェクトは冗長ではありません。オブジェクトはトークンとして機能し、単純な同期プロトコルを実装するために使用されます。ロックを保持している人は誰でも、ロックされたコードへのアクセスを許可されます。他のすべては、ロックが解除されるまで待つ必要があります。

オブジェクトがなければ、異なるトークンを持つことはできず、すべての同期は単一の内部トークンに依存します。それはあまり効果的ではありません。

于 2013-06-24T15:44:27.200 に答える
0

ここにはいくつかの側面があります。

  • ステートメントには、lock識別子としてオブジェクト参照が必要です。このロックを識別し、コード内に存在する可能性のある他のロックから分離する何かが必要です。

  • 保護しているデータは参照型ではないため、ロックの識別子として使用する別のものが必要です。

  • データ自体を識別子として使用できる場合でも、ロックの識別子としてのみ使用されるプライベート オブジェクトを使用することをお勧めします。そうすれば、クラス外のロックで使用された場合にデッドロックが発生する可能性があるため、クラス外で参照を公開する理由はありません。

于 2013-06-24T15:29:44.243 に答える