public class LostUpdate {
    private static int saldo = 0;

    public static void main(String[] args) throws InterruptedException {
        // Dua teller menambah saldo secara bersamaan.
        // Jeda sleep sengaja dipasang agar jendela race terbuka lebar
        // dan hasilnya bisa direproduksi untuk pembelajaran.
        Thread tellerA = new Thread(() -> {
            int baca = saldo; // langkah 1: baca saldo (0)
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                return;
            }
            saldo = baca + 1; // langkah 3: tulis hasil hitung (0 + 1)
        }, "teller-A");

        Thread tellerB = new Thread(() -> {
            int baca = saldo; // langkah 2: baca saldo (masih 0!)
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                return;
            }
            saldo = baca + 1; // langkah 4: tulis (0 + 1), menimpa tulisan teller-A
        }, "teller-B");

        tellerA.start();
        tellerB.start();
        tellerA.join();
        tellerB.join();

        System.out.println("saldo akhir : " + saldo);
        System.out.println("seharusnya  : 2");
    }
}
