final class NameVolatile {
@Nullable private volatile String name;
void setName(String name) {
this.name = name
}
void run() {
String name = name;
if (name != null) {
print(name);
}
}
}
final class NameSynchronized {
private final Object guard = new Object();
@Nullable private String name;
void setName(String name) {
synchronized(guard) {
this.name = name
}
}
void run() {
synchronized(guard) {
if (name != null) {
print(name);
}
}
}
}
以上是兩種方式來完成幾乎相同的事情的一個例子,但我不知道什麼時候更喜歡一個或另一個。對於可變引用字段中的不可變類型,請在本地使用volatile和cache或同步?
什麼情況下哪一個比另一個更有用?
我相信這個問題不同於Volatile or synchronized for primitive type?,因爲那裏的問題和答案沒有提到有一個本地緩存變量的做法。
可能重複的[原始類型的易失性或同步?](http://stackoverflow.com/questions/1779258/volatile-or-synchronized-for-primitive-type) – 4castle
我建議改爲使用['AtomicReference '](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html) –
4castle
與沒有本地緩存的易失性存儲器相比,它們有沒有同樣的缺點?它可以在空檢查和打印語句之間設置。 –