public class VolatileTidakAtomic {
    // volatile menjamin setiap pembacaan melihat tulisan termutakhir,
    // tetapi tidak menjadikan baca-hitung-tulis menjadi satu kesatuan.
    private static volatile int counter = 0;

    public static void main(String[] args) throws InterruptedException {
        Thread a = new Thread(() -> {
            int baca = counter; // membaca 0
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                return;
            }
            counter = baca + 1; // menulis 1
        }, "teller-A");

        Thread b = new Thread(() -> {
            int baca = counter; // masih membaca 0: teller-A belum menulis
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                return;
            }
            counter = baca + 1; // menulis 1, menimpa tulisan teller-A
        }, "teller-B");

        a.start();
        b.start();
        a.join();
        b.join();

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