Java 互斥锁与 wait/notify 用法详解
互斥锁在 Java 中由 synchronized 关键字实现。wait 和 notify 是 Object 类中的方法,用于实现线程之间的通信。\n\n使用互斥锁的基本用法如下:\n\n1. 定义一个共享变量作为互斥锁,可以是一个对象或者类的静态变量。\n\n2. 使用 synchronized 关键字来修饰需要互斥访问的代码块或方法。\n\n3. 在需要等待的地方调用 wait() 方法,使当前线程进入等待状态,并释放互斥锁。wait() 方法必须在 synchronized 代码块中调用。\n\n4. 在条件满足时,通过 notify() 或 notifyAll() 方法唤醒等待的线程。notify() 方法会随机选择一个等待的线程唤醒,而 notifyAll() 方法会唤醒所有等待的线程。notify() 和 notifyAll() 方法也必须在 synchronized 代码块中调用。\n\n下面是一个简单的示例:\n\njava\npublic class MutexExample {\n private static final Object lock = new Object();\n private static boolean condition = false;\n\n public static void main(String[] args) {\n Thread thread1 = new Thread(() -> {\n synchronized (lock) {\n while (!condition) {\n try {\n lock.wait();\n } catch (InterruptedException e) {\n e.printStackTrace();\n }\n }\n System.out.println("Thread 1: Condition is true");\n }\n });\n\n Thread thread2 = new Thread(() -> {\n synchronized (lock) {\n condition = true;\n lock.notify();\n System.out.println("Thread 2: Condition is set to true");\n }\n });\n\n thread1.start();\n thread2.start();\n }\n}\n\n\n在上面的示例中,我们定义了一个共享变量 condition 作为互斥锁,使用 synchronized 关键字修饰了两个线程中的代码块。\n\n线程 1 在进入 synchronized 代码块后,会检查 condition 是否为 false,如果是的话,调用 lock.wait() 方法进入等待状态,并释放互斥锁。线程 2 在进入 synchronized 代码块后,将 condition 设置为 true,并调用 lock.notify() 方法唤醒等待的线程。\n\n由于线程 1 在调用 wait() 方法后释放了互斥锁,所以线程 2 才能获得互斥锁并修改 condition。当线程 2 调用 notify() 方法后,线程 1 被唤醒并继续执行,输出 "Thread 1: Condition is true"。
原文地址: https://www.cveoy.top/t/topic/pup1 著作权归作者所有。请勿转载和采集!