118

私を悩ませ、心の中でいくつかの議論をする単純なばかげた質問があります。以下の質問についての疑問をすべて捨てたいと思います。

class Clstest{

    public static String testStaticMethod(String inFileStr) {

        // section 0

        // section 1

        // do something with inFileStr

        // section 2

        // section 3

        return inFileStr;

    }

}

5 つのスレッドがそれぞれClstest.testStaticMethod("arg-n")同時に呼び出しを実行しているとします。

スレッド 1 が を呼び出しますClstest.testStaticMethod("arg-1")

スレッド 1 がセクション 1 にある場合、スレッド 2 は を呼び出しますClstest.testStaticMethod("arg-2")

では、スレッド 1 はどうなるでしょうか。スリープ状態になりますか?

スレッド 1 がチャンスを得たとき、一時停止していたセクション 1 から実行を再開しますか?

Clstest.testStaticMethod5 つのスレッドすべてで 1 つの同じClstest.testStaticMethodスレッドが共有されている場合はどうなりますか?

inFileStr複数のスレッドから送信されたものを交換する可能性はありますか?

4

2 に答える 2

67

スリープ状態になりますか?

いいえ、意図的に相互に同期しない限り、スレッドを実行しても他のスレッドには影響しません。複数のプロセッサ コアがある場合 (最近のマシンはすべてそうです)、それらのスレッドはまったく同時に実行される可能性があります。マシンに十分なコアがない可能性があるため、5 つのスレッドを開始すると、その可能性は少し低くなります。オペレーティング システムはそれらのいずれかを選択することを余儀なくされ、それぞれに実行する時間が与えられます。スレッドスケジューラの仕事。スレッドは「スリープ」状態にはならず、単に一時停止され、スレッド スケジューラが実行する機会を与えるのを待っています。スケジューラによって中断されたところから再開します。

複数のスレッドから送信された inFileStr を交換する可能性はありますか?

そのような可能性はありません。スレッドには独自のスタックがあるため、メソッド引数とローカル変数はスレッドごとに一意になります。さらに文字列を使用すると、文字列は不変であるため、これらのスレッドが互いに干渉しないことが保証されます。

引数が別の種類の可変オブジェクトへの参照である場合、そのような保証はありません。または、メソッド自体が静的な変数またはヒープ上のオブジェクトへの参照を使用している場合。スレッドがオブジェクトを変更し、別のスレッドがそれを読み取る場合、同期が必要です。C# 言語のlockキーワードは、このような必要な同期を実装する定型的な方法です。メソッドが静的であるという事実は、そのような同期がまったく必要ないという意味ではありません。スレッドが同じオブジェクトにアクセスする ( thisを共有する) ことを心配する必要がないため、可能性は低くなります。

于 2013-06-27T13:09:32.387 に答える