public class ActionForm {
private Account temporaryAccount = null;
private Document document;
/**
* Save document from another thread that do not have a SecurityContext
*/
public void saveByAccount(Account account) {
this.temporaryAccount = account;
save();
this.temporaryAccount = null;
}
/**
* Save document to DB.
* I can not change the signature of this method.
*/
public synchronized void save() {
//get an account from shared variable or from SecurityContext
Account account = null;
Account temporaryAccount = this.temporaryAccount;
if (temporaryAccount == null) {
account = SecurityContextWrapper.getAccount();
} else {
account = temporaryAccount;
}
//save in DB
saveDocumentInDB(account, document);
}
}
type1 Thread: Пользователь может нажать кнопку "сохранить", в этом случае метод Save() будет вызывать непосредственно. Я получаю аккаунт из SecurityContext.Синхронизировать 2 Методы
Тип темы2: Пользователь запускает фоновый процесс. Я сохранить его/ее счет, а затем начать новую тему:
final Account account = SecurityContextWrapper.getAccount();
new Thread(new Runnable() {
public void run() {
...//do smth
saveByAccount(account);
}
}).start();
Проблема: Переменная this.temporaryAccount может быть изменен - между вызовом saveByAccount() и сохранить(). Знаете ли вы, как правильно синхронизировать эти методы?
Почему вы храните временную переменную на уровне класса, не можем ли мы разделить учетную запись между различными вызовами методов, например save (account); изнутри saveByAccount –
@Akash Yadav Метод save() используется во многих местах нашего проекта. Проблема заключается в изменении подписи. –
Добавьте новый метод 'save (Account a)', который содержит фактическую логику и вызовет 'save (temporAccount)' из 'save()' и т. Д. – Thomas