BankAccount 전송의 고전적인 문제에 대해 동기화 된 코드를 작성하려고했습니다. 이제 솔루션의 문제점을 파악하려고합니다. 웹에서 찾은 모든 솔루션에서 전송 방법은 두 개의 잠금을 사용했지만 아무 것도 사용하지 않았습니다.자바 동기화 은행 계좌 이체
class BankAccount
{
double balance;
public void synchronized deposit(double amount)
{
balance+=amount;
}
public void synchronized withdraw(double amount)
{
balance-=amount;
}
public void transferTo(BankAccount b, double amount)
{
this.withdraw(amount);
b.deposit(amount);
}
}
transferTo()
과 관련된 문제점을 알려주십시오. 제한 검사를하지 않으려면 balance
에 남겨주세요. 나는 실제로 transferTo를 원자 적으로 만드는 것이 교착 상태를 일으키는 지에 대해 우려하고있다. 그러한 상황의 예가 훌륭합니다.
글쎄 하나의 버그는 거기에 '이중'이라는 단어입니다. – Antimony
왜 이중에서 문제가 될 수 있습니까? –
결과를 반올림하지 않으면 일부 사람들이 용납 할 수없는 반올림 오류가 발생할 수 있습니다. 'long' 센트 나'BigDecimal'을 사용하는 것이 좋은 대안입니다. 결과 반올림은 대부분의 경우에 필요한 것입니다. –