import java.util.concurrent.atomic.AtomicLong;

public class ObjekAman {

    // Immutable: seluruh field final, disalin saat konstruksi, tak bisa berubah
    record Tagihan(String pelanggan, long jumlahTagihan) {
    }

    // State dibagi dijaga class concurrency -- bukan field telanjang
    static class Pembukuan {
        private final AtomicLong total = new AtomicLong();

        void catat(Tagihan t) {
            total.addAndGet(t.jumlahTagihan());
        }

        long total() {
            return total.get();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Tagihan[] tagihan = {
                new Tagihan("Budi", 150_000),
                new Tagihan("Siti", 250_000),
                new Tagihan("Dewi", 75_000),
                new Tagihan("Ani", 120_000),
                new Tagihan("Rahmat", 330_000),
        };

        Pembukuan pembukuan = new Pembukuan();
        Thread[] pekerja = new Thread[tagihan.length];

        for (int i = 0; i < tagihan.length; i++) {
            final Tagihan t = tagihan[i];
            pekerja[i] = new Thread(() -> pembukuan.catat(t));
            pekerja[i].start();
        }
        for (Thread p : pekerja) {
            p.join();
        }

        System.out.println("total tercatat : " + pembukuan.total());
        System.out.println("total harapan : " + 925_000);
    }
}
