java的互斥锁对wait和notify用法
互斥锁在Java中由synchronized关键字实现。wait和notify是Object类中的方法,用于实现线程之间的通信。
使用互斥锁的基本用法如下:
-
定义一个共享变量作为互斥锁,可以是一个对象或者类的静态变量。
-
使用synchronized关键字来修饰需要互斥访问的代码块或方法。
-
在需要等待的地方调用wait()方法,使当前线程进入等待状态,并释放互斥锁。wait()方法必须在synchronized代码块中调用。
-
在条件满足时,通过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"
原文地址: http://www.cveoy.top/t/topic/hLji 著作权归作者所有。请勿转载和采集!