1

次のクラススレッドは安全ですか?初期化された変数の読み取りと書き込みの同時実行について心配しています。スレッドセーフでない場合、スレッドセーフにする方法は?

  1. methodAを同期に変換すると役立つことはわかっていますが、これはしたくありません
  2. 「初期化された」変数に揮発性キーワークを追加するのはどうですか?
public class A {

    private boolean initialized;

    public synchronized void init(String configFilePath) {
        if (initialized) {
            return;
        }

        initialized = true;
    }

    public void methodA() {
        if (!initialized) {
            throw new ConfigurationException()
        }
    }
}

Update1:​​初期化された変数はinitメソッドで一度だけ変更され、他のすべてのメソッドは準備ができているだけです。その場合、初期化されたものにvolatileを追加すると、スレッドセーフになりますが、それは正しいですか?

4

3 に答える 3

3

いいえ、スレッドセーフではありません。ルーチンは、が呼び出されたときinitに設定の途中にある可能性があります。同期されていないため、実行と読み込みの競合を防ぐことはできません。実際、書き込みは発生した可能性もありますが、呼び出したスレッドにはまだ伝播されていません。initializedmethodAmethodAinitialized = trueif( !initialized)methodA

volatiletoを追加するinitializedと、値の伝播の問題は解決しますが、最初の問題は解決しません。

これに関する詳細については、BrianGoetzの記事ManagingVolatilityをお勧めします。

于 2012-12-06T23:27:47.720 に答える
0

いいえ、スレッドセーフではありません。同期する必要があります。

于 2012-12-06T23:31:59.070 に答える