import java.util.concurrent.atomic.AtomicInteger;

public class PolaCAS {
    public static void main(String[] args) throws InterruptedException {
        // ---- Bagian 1: kontrak compareAndSet(expected, update) ----
        AtomicInteger nilai = new AtomicInteger(100);
        boolean sukses1 = nilai.compareAndSet(100, 250); // nilai memang 100
        boolean sukses2 = nilai.compareAndSet(100, 999); // nilai sudah 250
        System.out.println("CAS(100 -> 250) berhasil : " + sukses1);
        System.out.println("CAS(100 -> 999) berhasil : " + sukses2);
        System.out.println("nilai sekarang           : " + nilai.get());

        // ---- Bagian 2: pola retry loop tanpa lock ----
        AtomicInteger tertinggi = new AtomicInteger(0);
        int[] penawaran = {1500, 900, 2300, 1750};

        Thread[] pelelang = new Thread[penawaran.length];
        for (int i = 0; i < penawaran.length; i++) {
            int target = penawaran[i];
            pelelang[i] = new Thread(() -> {
                while (true) {
                    int lama = tertinggi.get();
                    if (target <= lama) {
                        return; // penawaran kita kalah: tidak ada yang perlu ditukar
                    }
                    if (tertinggi.compareAndSet(lama, target)) {
                        return; // berhasil menjadi tertinggi yang baru
                    }
                    // CAS gagal karena thread lain mengubah lebih dulu: ulangi.
                }
            }, "pelelang-" + (i + 1));
            pelelang[i].start();
        }
        for (Thread t : pelelang) {
            t.join();
        }
        System.out.println("harga tertinggi akhir    : " + tertinggi.get());
    }
}
