このコードで volatile と synchronized を一緒に使用する理由はありますか?
public class Helper {
private volatile int n;
private final Object lock = new Object();
public Helper(int n) {
this.n = n;
}
public void setN(int value) {
synchronized (lock) {
n = value;
}
}
}
クラス ヘルパーはスレッド セーフである必要があります。「Java Concurrency Guidelines」の本からこの例を入手しましたが、まだ明確ではありません。この例で volatile と synchronized を一緒に使用する理由は何ですか?