溫馨提示×

java mutex的等待/通知機制

小樊
83
2024-08-06 15:28:16
欄目: 編程語言

在Java中,Mutex通常使用synchronized關鍵字或者Lock接口來實現。當一個線程獲取了Mutex的鎖之后,其他線程就會被阻塞在獲取鎖的地方,直到該線程釋放了鎖。

等待/通知機制可以通過wait()和notify()/notifyAll()方法來實現。當一個線程調用wait()方法時,它會釋放鎖并進入等待狀態(tài)。而當另一個線程調用notify()/notifyAll()方法時,等待的線程會被喚醒并且可以重新競爭鎖。

下面是一個簡單的示例代碼,演示了Java中的Mutex的等待/通知機制:

public class MutexExample {
    private boolean isLocked = false;

    public synchronized void lock() throws InterruptedException {
        while (isLocked) {
            wait();
        }
        isLocked = true;
    }

    public synchronized void unlock() {
        isLocked = false;
        notify();
    }

    public static void main(String[] args) {
        MutexExample mutex = new MutexExample();

        Thread thread1 = new Thread(() -> {
            try {
                mutex.lock();
                System.out.println("Thread 1 has acquired the lock");
                Thread.sleep(2000);
                mutex.unlock();
                System.out.println("Thread 1 has released the lock");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        Thread thread2 = new Thread(() -> {
            try {
                mutex.lock();
                System.out.println("Thread 2 has acquired the lock");
                mutex.unlock();
                System.out.println("Thread 2 has released the lock");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        thread1.start();
        thread2.start();
    }
}

在這個例子中,MutexExample類表示一個簡單的Mutex,其中l(wèi)ock()方法用于獲取鎖,unlock()方法用于釋放鎖。在main()方法中,創(chuàng)建了兩個線程分別獲取和釋放Mutex的鎖??梢钥吹剑斠粋€線程獲取了鎖之后,另一個線程會被阻塞直到第一個線程釋放了鎖。

0