У меня есть приложение, которое использует несколько потоков для записи в одну переменную «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