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