package bank_conditions; import java.util.Random; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class Bank { Client[] clients; Random rg; ReentrantLock lock; /* uslovni redovi cekanja, koji omogucavaju * da se niti koje ne ispunjavaju neki uslov * za ulazak u kriticnu sekciju blokiraju i ne * smetaju drugim nitima */ Condition hasMoney; public Bank() { rg=new Random(); lock=new ReentrantLock(); /* uslovni red cekanja je vezan za konkretan katanac */ hasMoney=lock.newCondition(); clients=new Client[100]; for(int i=0; iclients[from].balance) try { hasMoney.await(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } clients[from].balance-=amount; clients[to].balance+=amount; System.out.printf("%d %d (%d->%d) Total: %d\n", clients[from].balance,amount, from,to,total()); /* signalAll nakon zavrsetka transfera obavestava druge niti * koje cekaju na hasMoney listi cekanja da probaju * da udju u kriticnu sekciju, jer su mozda ispunili * uslov (posto je ova nit bas nekom od njih prebacila) * novac koji im je dovoljan da sada oni izvrse transfer * ka nekom trecem racunu. */ hasMoney.signalAll(); lock.unlock(); } int total(){ int total=0; for(int i=0; i