2012-08-16 2 views
0

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를 원자 적으로 만드는 것이 교착 상태를 일으키는 지에 대해 우려하고있다. 그러한 상황의 예가 훌륭합니다.

+0

글쎄 하나의 버그는 거기에 '이중'이라는 단어입니다. – Antimony

+0

왜 이중에서 문제가 될 수 있습니까? –

+0

결과를 반올림하지 않으면 일부 사람들이 용납 할 수없는 반올림 오류가 발생할 수 있습니다. 'long' 센트 나'BigDecimal'을 사용하는 것이 좋은 대안입니다. 결과 반올림은 대부분의 경우에 필요한 것입니다. –

답변

1

double을 사용하는 것 외에도 특별한 문제는 보이지 않지만 원자가 아닌 transferTo가 나중에 문제를 일으킬 수 있다는 점을 명심해야합니다. 그러나 실제로는 잠금을 사용하고 있습니다. 동기화 된 각 메소드는 암시 적으로 잠금을 사용합니다.

0

synchronized 블록을 제자리에 넣 자마자 잠금 장치를 사용하고 있습니다. 이 경우 잠금은 수정중인 클래스 객체에 대해 획득되므로 이것이 코드가 정상적으로 작동하는 이유입니다.

그러나이 두 가지 작업이 동기화되지만 전체 트랜잭션이 아니기 때문에 transferTo 메서드가 올바르게 작동하지 않을 수 있습니다.

희망이 도움이됩니다!

+0

실제로 transferTo 메소드를 원자 적으로 만들면 문제가 발생하는 경우를 찾으려고합니다. –

+0

@user 개념적으로, 현실 세계에서는 그러한 거래가 원자 적이지 않기 때문에 문제가되지 않습니다. 사용자가 원자적일 것으로 예상하는 경우에만 문제가됩니다. 또한 실제로 클래스 개체가 아닌 인스턴스를 잠그고 있습니다 (Bharat misspoke라고 생각합니다) – Antimony

관련 문제