我有一個應用程序使用多個線程寫入下面的單個變量「theVar」。 99%的時間我有正確的數據,但有時一些數據丟失。我一直試圖解決這個問題近一個星期了,我真的很失落。它突然發生,我失去了數據,這是一個非常嚴重的問題。我究竟做錯了什麼?卡住更新由多個線程更新的單個變量
class Singleton {
private volatile Singleton instance;
private volatile String theVar = null;
private final Object lock = new Object();
public void setVar(String newVar) {
synchronized (lock) {
theVar = newVar;
}
}
public String getVar() {
synchronized (lock) {
return theVar;
}
}
public void appendVar(String text) {
synchronized (lock) {
theVar += text;
}
}
protected Singleton() {
}
public static Singleton getInstance() {
Singleton instance = this.instance;
if (instance == null) {
synchronized (this) {
instance = this.instance;
if (instance == null) {
instance = this.instance = new Singleton();
}
}
}
return instance;
}
}
'instance'不是'volatile'。您的[DCL](https://en.wikipedia.org/wiki/Double-checked_locking)已損壞。此外,由於'lock'是一個實例變量,並且您總是鎖定整個實例方法,'synchronized'關鍵字有什麼問題? –
謝謝Sotirios。我現在已經更新了這個問題。 – Karthik
鮑里斯 - 感謝您的鏈接,我會看看DCL。因此,而不是鎖定變量「theVar」,我應該鎖定整個實例?什麼是同步? – Karthik