温馨提示×

java mutex的等待/通知机制

小樊
84
2024-08-06 15:28:16
栏目: 编程语言

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

0