1  import java.util.concurrent.locks.Lock;
  2  import java.util.concurrent.locks.ReentrantLock;
  3  
  4  /**
  5     A bank account has a balance that can be changed by 
  6     deposits and withdrawals.
  7  */
  8  public class BankAccount
  9  {  
 10     private double balance;
 11     private Lock balanceChangeLock;
 12  
 13     /**
 14        Constructs a bank account with a zero balance.
 15     */
 16     public BankAccount()
 17     {   
 18        balance = 0;
 19        balanceChangeLock = new ReentrantLock();
 20     }
 21  
 22     /**
 23        Constructs a bank account with a given balance.
 24        @param initialBalance the initial balance
 25     */
 26     public BankAccount(double initialBalance)
 27     {   
 28        balance = initialBalance;
 29     }
 30  
 31     /**
 32        Deposits money into the bank account.
 33        @param amount the amount to deposit
 34     */
 35     public void deposit(double amount)
 36     {  
 37        balanceChangeLock.lock();
 38        try
 39        {
 40           double newBalance = balance + amount;
 41           balance = newBalance;
 42        }
 43        finally
 44        {
 45           balanceChangeLock.unlock();
 46        }
 47     }
 48  
 49     /**
 50        Withdraws money from the bank account.
 51        @param amount the amount to withdraw
 52     */
 53     public void withdraw(double amount)
 54     {   
 55        balanceChangeLock.lock();
 56        try
 57        {
 58           double newBalance = balance - amount;
 59           balance = newBalance;
 60        }
 61        finally
 62        {
 63           balanceChangeLock.unlock();
 64        }
 65     }
 66  
 67     /**
 68        Gets the current balance of the bank account.
 69        @return the current balance
 70     */
 71     public double getBalance()
 72     {   
 73        return balance;
 74     }
 75  }
 76