1
public class ThreadSafe {

    private int aField;

    public synchronized void setAField(int value) {
        aField = value;
    }

    public synchronized int getAField() {
        return aField;
    }

}

public class ThreadSafeToo {

    private volatile int aField;

    public synchronized void setAField(int value) {
        aField = value;
    }

    public int getAField() {
        return aField;
    }

}

public class DontKnowIfThreadSafeButMostLikelyYes {

    private static int aField;

    public synchronized void setAField(int value) {
        aField = value;
    }

    public int getAField() {
        return aField;
    }

}

質問:

  • DontKnowIfThreadSafeButMostLikelyYes はスレッドセーフですか?

  • 好まれるイディオムとその理由は何ですか?

4

4 に答える 4

5

ThreadSafeToo同期されたメソッドは必要ありません。揮発性の割り当てはアトミックであり、可視性の保証を提供します。

DontKnowIfThreadSafeButMostLikelyYesはスレッドセーフではありません。共有変数への読み取りと書き込みを同期する必要があります。

好ましいイディオムは主観的ですが、あなたの場合、効率的なアプローチは次のとおりです。

public class ThreadSafeToo {
    private volatile int aField;
    public void setAField(int value) { aField = value; }
    public int getAField() { return aField; }
}
于 2013-08-02T13:32:07.840 に答える
0
Is DontKnowIfThreadSafeButMostLikelyYes thread-safe?

いいえ、ゲッターとセッターが同時に呼び出されると、ゲッターが古い値を返す可能性があるためです。

What would be the preferred idiom and why?

この場合、2 番目のクラスは正しく同期され、スレッドセーフです

于 2013-08-02T13:31:40.067 に答える