我最近正在阅读一些有关 Java 并发的书籍。关于线程安全,如果无法使类不可变,则始终可以通过同步其数据来确保线程安全。
下面的类显然不是线程安全的
public class NotThreadSafe {
private int value;
public void setValue(int value) {
this.value = value;
}
public int getValue() {
return this.value;
}
}
然后我可以同步写入,但它仍然不是线程安全的
public class StillNotThreadSafe {
private int value;
public synchronized void setValue(int value) {
this.value = value;
}
public int getValue() {
return this.value;
}
}
因为我不仅需要同步写入,还需要同步读取
public class ThreadSafe {
private int value;
public synchronized void setValue(int value) {
this.value = value;
}
public synchronized int getValue() {
return this.value;
}
}
现在的问题是,通过使用 volatile 我可以保证其他线程会看到更新的值,所以这让我认为这个类应该是线程安全的
public class NotSure {
private volatile int value;
public synchronized void setValue(int value) {
this.value = value;
}
public int getValue() {
return this.value;
}
}
最后一个类是线程安全的吗?