在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的锁。可以看到,当一个线程获取了锁之后,另一个线程会被阻塞直到第一个线程释放了锁。