6

次のように定義されたクラスがあるとしましょう。

public class MyClass {

    private static int data;

    public static staticMethod(int val){
      ... do something with data based on val ...
    }
}

そして、静的メソッドを呼び出す多くの Java スレッドがアプリケーションで実行されているとします。

MyClass.staticMethod(int)

メソッドは呼び出しごとにブロックされますか? つまり、スレッド 1 が最初にメソッドを呼び出し、そのメソッドの実行中にスレッド 2 が静的メソッドを呼び出した場合、2 番目のスレッドは最初の実行が完了するまで待機する必要がありますか?

答えが「いいえ」の場合、「同期されていない」方法で静的データ メンバーを使用する意味があるのはいつでしょうか?

4

4 に答える 4

6

メソッドは呼び出しごとにブロックされますか?

いいえ。プレーンstaticメソッドは他のスレッドをブロックしません。(しかし、static synchronizedメソッドは他のスレッドをブロックすることができます...または他のスレッドによってブロックされます。)

答えが「いいえ」の場合、「同期されていない」方法で静的データ メンバーを使用する意味があるのはいつでしょうか?

  • メンバが volatile の制限を法としている場合、データ メンバはvolatile... であれば OK です。

  • finalデータ メンバがスレッド セーフな型への参照であれば問題ありません。

  • データ メンバがスレッド限定であれば問題ありません。(メンバーはすべてのスレッドから見えるため、可能性は低いですstaticが、可能です。)

  • 他の何かが同期を処理している場合、またはLock相互排除のためにオブジェクトを使用している場合などは問題ありませんが、おそらくこれらは「カウントしない」と言うでしょう。

于 2013-09-18T00:17:41.700 に答える
0

いいえ、クラス/メソッドが declare でない限り、そうではありませんSynchronized

http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html

于 2013-09-17T23:44:03.297 に答える