public class BenderaVolatile {
    private static int angka = 0;                 // data biasa, non-volatile
    private static volatile boolean siap = false;  // bendera pengumuman

    public static void main(String[] args) throws InterruptedException {
        int[] hasilBaca = new int[1];

        Thread pembaca = new Thread(() -> {
            // Menunggu bendera menyala; onSpinWait() memberi sinyal ke CPU
            // bahwa loop ini sengaja sibuk menunggu.
            while (!siap) {
                Thread.onSpinWait();
            }
            // Melihat siap == true berarti seluruh tulisan sebelum penulis
            // menyalakan bendera sudah terlihat -- termasuk angka = 42.
            hasilBaca[0] = angka;
        }, "pembaca");

        Thread penulis = new Thread(() -> {
            angka = 42;  // tulisan data dilakukan lebih dulu...
            siap = true; // ...baru bendera dinyalakan setelah data siap
        }, "penulis");

        pembaca.start();
        Thread.sleep(50); // biarkan pembaca sempat menunggu di loop
        penulis.start();

        pembaca.join();
        penulis.join();

        System.out.println("pembaca melihat angka : " + hasilBaca[0]);
        System.out.println("pembaca melihat siap  : " + siap);
    }
}
