1

最近、同僚がコードを思いつき、コードのスレッド セーフについて意見を求めてきました。以下は、コードと同じシナリオを示す例です。

public class classA
{
   public int DoWorkA() 
   { 
       //some logic 
   }
}

public class classB
{
     public static classA objA = new classA();
}

public class classC
{
        int DoWorkC () 
        {

           return classB.objA.DoWorkA();

        }
}

ClassB.objA.DoWorkA() が ClassC、ClassD などの異なるクラスの異なるインスタンスで同時に呼び出された場合、スレッド化または「オーバーラップ」の問題は発生しますか? objA をインスタンス メンバーに変換する必要がありますか?

4

2 に答える 2

2

objAは static であるため、 のインスタンスは 1 つだけになりますclassAこれは、すべてのスレッドが同じインスタンスDoWorkA()のメソッドにアクセスすることを意味しますが、メソッド呼び出しがスレッドセーフであることを意味するわけではありません。これは完全に の実装に依存します。DoWorkA()

DoWorkAロックやスレッドセーフなコレクションの使用など、同時アクセスで発生する可能性のある問題から保護するために、適切なロジックが必要です。

于 2012-06-05T17:26:45.123 に答える
1

スレッドまたは「オーバーラップ」の問題はありますか

それは何をするかによります//some logic。各呼び出しは同じインスタンスを共有するDoWorkAため、これが正しく機能するにはスレッドセーフである必要があります。

これを安全に行うには、内部で使用されるすべてのデータ//some logicを適切に同期する必要があります。

于 2012-06-05T17:26:55.157 に答える