互斥锁在Java中由synchronized关键字实现。wait和notify是Object类中的方法,用于实现线程之间的通信。

使用互斥锁的基本用法如下:

  1. 定义一个共享变量作为互斥锁,可以是一个对象或者类的静态变量。

  2. 使用synchronized关键字来修饰需要互斥访问的代码块或方法。

  3. 在需要等待的地方调用wait()方法,使当前线程进入等待状态,并释放互斥锁。wait()方法必须在synchronized代码块中调用。

  4. 在条件满足时,通过notify()或notifyAll()方法唤醒等待的线程。notify()方法会随机选择一个等待的线程唤醒,而notifyAll()方法会唤醒所有等待的线程。notify()和notifyAll()方法也必须在synchronized代码块中调用。

下面是一个简单的示例:

public class MutexExample {
    private static final Object lock = new Object();
    private static boolean condition = false;

    public static void main(String[] args) {
        Thread thread1 = new Thread(() -> {
            synchronized (lock) {
                while (!condition) {
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("Thread 1: Condition is true");
            }
        });

        Thread thread2 = new Thread(() -> {
            synchronized (lock) {
                condition = true;
                lock.notify();
                System.out.println("Thread 2: Condition is set to true");
            }
        });

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

在上面的示例中,我们定义了一个共享变量condition作为互斥锁,使用synchronized关键字修饰了两个线程中的代码块。

线程1在进入synchronized代码块后,会检查condition是否为false,如果是的话,调用lock.wait()方法进入等待状态,并释放互斥锁。线程2在进入synchronized代码块后,将condition设置为true,并调用lock.notify()方法唤醒等待的线程。

由于线程1在调用wait()方法后释放了互斥锁,所以线程2才能获得互斥锁并修改condition。当线程2调用notify()方法后,线程1被唤醒并继续执行,输出"Thread 1: Condition is true"

java的互斥锁对wait和notify用法

原文地址: http://www.cveoy.top/t/topic/hLji 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录