2

私の質問はここにある他の多くの質問のように聞こえるかもしれませんが、私が見つけられなかった風味があります.

次のロジックを理解しようとしています

汎用オブジェクト

public class GenericClass
{
    public static void DoSomething(Object lockObj)
    {
        lock(lockObj)
        {
            // do something here
        }
    }
} 

クラスA

internal class A
{
    private static _aLock = new Object();

    public void Do_A_Thing()
    {
        GenericClass.DoSomething(_aLock);
    }
} 

クラスB

internal class B
{
    private static _bLock = new Object();

    public void Do_B_Thing()
    {
        GenericClass.DoSomething(_bLock);
    }
} 

私の説明が正しいかどうかを確認したいだけです:

クラス「A」の複数のスレッドが「genericClass」メソッド「DoSomething」のコードに同時にアクセスしようとすると、このメソッドはクラス「A」の 1 つを除くすべてのインスタンスにロックされます。ただし、クラス「B」の単一のインスタンスは、いつでも実行を続行できます。クラス「B」にも複数のインスタンスが実行される場合、それらはクラス「A」のロックに干渉しません。

これは、上記の内容に基づいて正しいですか?

4

4 に答える 4

3

はい、あなたの説明は正しいように聞こえます。でロック オブジェクトを渡すのは少し珍しいかもしれませんが、問題なく動作します。私が提案する唯一の変更は、誤って値を別の参照に変更できないようにstaticフィールドを作成することです。readonlyobject

于 2013-09-24T22:13:38.083 に答える
2

はい、そうです。ロックインAとロックインBはお互いをまったく認識していません。コードは、識別子と同じオブジェクトでロックしている別のスレッドがある場合にのみブロックされます。

于 2013-09-24T22:15:20.423 に答える