Здесь я вижу два возможных ответа:
- Расширение класса Acount и синхронизация доступа к методу:
public class SyncrhonizedAccess extends Account {
public synchronized boolean withdraw() {
return super.withdraw();
}
public synchronized boolean deposite() {
return super.deposite();
}
}
Обтекание класса и синхронизация доступа к обернутому объекту:
public class AccountWrapper {
private final Account realAcount;
public AccountWrapper(Account realAccount) {
this.realAccount = realAccount;
}
public synchronized boolean withdraw()
{
return realAccount.withdraw();
}
public synchronized boolean deposite()
{
return realAccount.deposite();
}
}
Теперь оба метода могут быть выполнены различными способами (вручную, как я показал), автоматически генерируемыми ( это сводится к одному из вышеупомянутых методов, которые просто выполняются "автоматически" такими библиотеками, как CGLIB (библиотека генерации байтового кода)), или даже с использованием AOP (Аспектно-ориентированное программирование).
Еще одно замечание: вместо слова synchronized
можно создать блокировку и синхронизировать ее внутри метода внутри.
Конечно, все это имеет смысл, если класс Account
имеет общее состояние - поля данных, которые фактически изменены и доступны как withdraw
, так и deposite
. В противном случае вам не нужно ничего синхронизировать.