package archimulator.util.transactional; import org.multiverse.api.references.TxnInteger; import org.multiverse.api.references.TxnRef; import java.util.Date; import static org.multiverse.api.StmUtils.*; public class Account { private final TxnRef<Date> lastUpdate; private final TxnInteger balance; public Account(int balance) { this.lastUpdate = newTxnRef(new Date()); this.balance = newTxnInteger(balance); } public void incrementBalance(final int amount, final Date date) { atomic(() -> { balance.increment(amount); lastUpdate.set(date); if (balance.get() < 0) { throw new IllegalStateException("Not enough money"); } }); } public Date getLastUpdate() { return lastUpdate.atomicGet(); } public int getBalance() { return balance.atomicGet(); } public static void transfer(final Account from, final Account to, final int amount) { atomic(() -> { Date date = new Date(); from.incrementBalance(-amount, date); to.incrementBalance(amount, date); }); } public static void main(String[] args) { Account a = new Account(10); Account b = new Account(20); transfer(a, b, 10); System.out.printf("a.balance: %d, a.lastUpdate: %s%n", a.getBalance(), a.getLastUpdate()); System.out.printf("b.balance: %d, b.lastUpdate: %s%n", b.getBalance(), b.getLastUpdate()); } }