在Java中,Mutex通常使用synchronized關鍵字或者Lock接口來實現。當一個線程獲取了Mutex的鎖之后,其他線程就會被阻塞在獲取鎖的地方,直到該線程釋放了鎖。
等待/通知機制可以通過wait()和notify()/notifyAll()方法來實現。當一個線程調用wait()方法時,它會釋放鎖并進入等待狀態。而當另一個線程調用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,其中lock()方法用于獲取鎖,unlock()方法用于釋放鎖。在main()方法中,創建了兩個線程分別獲取和釋放Mutex的鎖。可以看到,當一個線程獲取了鎖之后,另一個線程會被阻塞直到第一個線程釋放了鎖。