Simulates an ATM using thread synchronization mechanisms to safely perform dummy money transfers on a multithreaded, high-traffic environment.
Data representing a transaction (deposit, withdrawal) is produced by a TransationProducer, enqueued, and then processed through a TransactionConsumer.