package SynchBankTest;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* Bank cu conturi
* @author Dan
*
*/
public class Bank
{
/**
* Constructor de Obiect, ce descrie bancul
* @param n numarul de conturi
* @param initialBalance suma initiala pentru fiecare cont
*/
public Bank(int n, double initialBalance)
{
accounts = new double[n];
for(int i = 0; i<accounts.length;i++)
{
accounts[i] = initialBalance;
}
bankLock = new ReentrantLock();
suffiecientFunds = bankLock.newCondition();
}
/**
* Transmite banii depe un cont la altul
* @param from Contul, de pe care se scot banii
* @param to Contul, pe care vin banii
* @param amount Suma, care se va transmite
*
*/
public void transfer(int from,int to,double amount)
throws InterruptedException
{
bankLock.lock();
try
{
if(accounts[from] < amount) return;
System.out.println(Thread.currentThread());
accounts[from] -= amount;
System.out.printf(" %10.2f from %d to %d", amount,from,to);
accounts[to] += amount;
System.out.printf("Total Balance: %10.2f%n",getTotalBalance());
suffiecientFunds.signalAll();
}
finally
{
bankLock.unlock();
}
}
/**
* Primirea sumei totale de pe toate conturile
* @return Suma totala
*/
public double getTotalBalance()
{
bankLock.lock();
try
{
double sum = 0;
for(double a: accounts)
{
sum += a;
}
return sum;
}
finally
{
bankLock.unlock();
}
}
/**
* Primirea numarului de conturi in Banca
* return numarul de conturi
*/
public int size()
{
return accounts.length;
}
private double[] accounts;
private Lock bankLock;
private Condition suffiecientFunds;
}