import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

public class TryLockTimeout {
    public static void main(String[] args) throws InterruptedException {
        ReentrantLock kunci = new ReentrantLock();

        // Percobaan 0: tryLock() tanpa batas waktu saat lock masih bebas.
        boolean bebas = kunci.tryLock(); // langsung melaporkan true/false tanpa menunggu
        System.out.println("tryLock() langsung : " + bebas);
        if (bebas) {
            kunci.unlock();
        }

        // Pemegang lock akan menahan lock selama 300 milidetik.
        Thread pemegang = new Thread(() -> {
            kunci.lock();
            try {
                try {
                    Thread.sleep(300);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            } finally {
                kunci.unlock();
            }
        }, "pemegang");
        pemegang.start();
        Thread.sleep(50); // pastikan pemegang sudah memegang lock

        // Percobaan 1: batas waktu 50 ms -- lock baru lepas di sekitar ms ke-300.
        boolean suksesCepat = kunci.tryLock(50, TimeUnit.MILLISECONDS);
        if (suksesCepat) {
            kunci.unlock(); // kebetulan berhasil: lepaskan kembali
        } else {
            System.out.println("tryLock(50 ms)     : gagal (lock masih dipegang)");
        }

        // Percobaan 2: batas waktu 1 detik -- menunggu sampai pemegang selesai.
        boolean suksesSabar = kunci.tryLock(1, TimeUnit.SECONDS);
        System.out.println("tryLock(1 detik)   : " + (suksesSabar ? "berhasil" : "gagal"));
        if (suksesSabar) {
            kunci.unlock();
        }

        pemegang.join();
    }
}
