なぜ冗長ロックオブジェクトが必要ですか?

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

上記の例では、 lock キーワードとともにオブジェクト thisLock が使用されています。なぜこれが必要ですか?それは他の目的を持っていないようです。なぜ単に lock というキーワードだけではないのですか?

4
@ChrisSinclairあなたの答えは私が探していたものを私に与える。ありがとう。
追加された 著者 sprocket12,
@ChrisSinclairあなたの答えは私が探していたものを私に与える。ありがとう。
追加された 著者 sprocket12,
lockキーワード自体は無効なC#です。あなたは lock(this){...} を考えていますか?
追加された 著者 Jon Skeet,
lock はドアをロックしていると考えてください。 どのドアが施錠されていますか?は関連する質問ですか?
追加された 著者 Eric Lippert,
lock はドアをロックしていると考えてください。 どのドアが施錠されていますか?は関連する質問ですか?
追加された 著者 Eric Lippert,
理論的には理論的にそのの一意のオブジェクトを扱う lock() i>特定のロック。しかし、例えば、 staticinstance レベルのロックなど、いくつかのユーザビリティに関する質問を提起するでしょうか?言うまでもなく、 lock(mySharedSyncObject)の代わりに誤って lock()を置いた場合、誤ってロックを共有しないようにするのは簡単です。簡単にそれを避け、私たちのロックインテントを適用するために私たちにオーナスを置くだけです。
追加された 著者 Chris Sinclair,
理論的には理論的にそのの一意のオブジェクトを扱う lock() i>特定のロック。しかし、例えば、 staticinstance レベルのロックなど、いくつかのユーザビリティに関する質問を提起するでしょうか?言うまでもなく、 lock(mySharedSyncObject)の代わりに誤って lock()を置いた場合、誤ってロックを共有しないようにするのは簡単です。簡単にそれを避け、私たちのロックインテントを適用するために私たちにオーナスを置くだけです。
追加された 著者 Chris Sinclair,

6 答え

lock keyword cannot exist on it's own, it always takes a parameter which will act as a semaphore (synchronizing object), allowing only one thread to proceed.

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

同期オブジェクトをロックできるスレッドは1つだけです(この場合は、   ロックが解放されるまで、競合スレッドはブロックされます。複数のスレッドがロックを争う場合、それらは   「レディキュー」にキューイングされ、先着順のロックを許可され、   先着順である(注意点として、   WindowsとCLRでは、キューの公平性が   侵害される)。

4
追加された
はい、それは何らかの単一参照点を明確にしていますが、言語の機能が、自動/組み込みが可能なときに、開発者がオブジェクトをインスタンス化する必要があった理由として混乱しました。だから私はもっとそれがあったかもしれないと思っていた。
追加された 著者 sprocket12,
たとえば、ソースコードを見てください。 ConcurrentDictionary では、テーブルの各セクションに別々のロックオブジェクトが使用されます。これにより、テーブルの異なるセクションでアクセスが行われている限り、(オブジェクトの削除や追加の場合でも)辞書への同時アクセスが可能になります。ロックオブジェクトを共有すると、一度に1つの操作しか実行できないことを意味します。
追加された 著者 Brian,
@MuhammadAこれは、クラス内の単一の lock ステートメントが同じオブジェクトを使用してロックオンすることを前提としています。それは誤った仮定です。これはおそらく最も一般的な操作ですが、ロックするオブジェクト(動的に決定するか静的に決定するか)は非常に一般的です。これが lock を非常に柔軟にする理由です。
追加された 著者 Servy,

lock keyword cannot exist on it's own, it always takes a parameter which will act as a semaphore (synchronizing object), allowing only one thread to proceed.

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

同期オブジェクトをロックできるスレッドは1つだけです(この場合は、   ロックが解放されるまで、競合スレッドはブロックされます。複数のスレッドがロックを争う場合、それらは   「レディキュー」にキューイングされ、先着順のロックを許可され、   先着順である(注意点として、   WindowsとCLRでは、キューの公平性が   侵害される)。

4
追加された
はい、それは何らかの単一参照点を明確にしていますが、言語の機能が、自動/組み込みが可能なときに、開発者がオブジェクトをインスタンス化する必要があった理由として混乱しました。だから私はもっとそれがあったかもしれないと思っていた。
追加された 著者 sprocket12,
たとえば、ソースコードを見てください。 ConcurrentDictionary では、テーブルの各セクションに別々のロックオブジェクトが使用されます。これにより、テーブルの異なるセクションでアクセスが行われている限り、(オブジェクトの削除や追加の場合でも)辞書への同時アクセスが可能になります。ロックオブジェクトを共有すると、一度に1つの操作しか実行できないことを意味します。
追加された 著者 Brian,
@MuhammadAこれは、クラス内の単一の lock ステートメントが同じオブジェクトを使用してロックオンすることを前提としています。それは誤った仮定です。これはおそらく最も一般的な操作ですが、ロックするオブジェクト(動的に決定するか静的に決定するか)は非常に一般的です。これが lock を非常に柔軟にする理由です。
追加された 著者 Servy,

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

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

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

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

0
追加された

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

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

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

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

0
追加された

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

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

0
追加された

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

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

0
追加された