除"synchronized"之外的Java类中的getter的线程安全习惯用法

dei*_*rus 1 java concurrency

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

问题:

  • DontKnowIfThreadSafeButMostLikely是否是线程安全的?

  • 什么是首选的成语,为什么?

ass*_*ias 5

ThreadSafeToo 不需要同步方法:volatile赋值是原子的,并提供可见性保证.

DontKnowIfThreadSafeButMostLikelyYes 不是线程安全的:您需要同步对共享变量的读取和写入.

首选成语是主观的,但在您的情况下,有效的方法是:

public class ThreadSafeToo {
    private volatile int aField;
    public void setAField(int value) { aField = value; }
    public int getAField() { return aField; }
}
Run Code Online (Sandbox Code Playgroud)