Java中的notify()释放锁

在Java中,锁是多线程编程中非常重要的概念。通过锁,我们可以控制多个线程之间对共享资源的访问,避免出现数据竞争和不一致的情况。而notify()方法则是在Java中用来通知等待在对象监视器上的线程的方法之一。它会释放锁并唤醒等待的线程,让其有机会继续执行。

什么是notify()方法?

在Java中,每个对象都有一个监视器(monitor),也就是一个锁。当一个线程进入一个同步代码块或同步方法时,它会锁住这个对象的监视器。如果另一个线程也想要执行这个同步代码块或方法,但此时对象的监视器已经被锁住了,那么这个线程就会被阻塞,进入等待状态。

这时,我们可以使用notify()方法来通知等待的线程,让其有机会继续执行。notify()方法会选择一个等待的线程来唤醒,并释放锁,但并不会立即释放锁,而是等到当前线程执行完同步代码块或方法后才会释放。如果希望唤醒所有等待的线程,可以使用notifyAll()方法。

示例

下面我们来看一个简单的示例,演示如何使用wait()notify()方法来控制多个线程的执行顺序。

public class WaitNotifyExample {
    public static void main(String[] args) {
        final Object lock = new Object();
        
        Thread thread1 = new Thread(() -> {
            synchronized (lock) {
                System.out.println("Thread 1 is waiting");
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Thread 1 is notified");
            }
        });
        
        Thread thread2 = new Thread(() -> {
            synchronized (lock) {
                System.out.println("Thread 2 is notifying");
                lock.notify();
            }
        });
        
        thread1.start();
        thread2.start();
    }
}

在上面的示例中,我们创建了两个线程thread1thread2,它们共享一个对象lockthread1首先进入同步代码块,打印"Thread 1 is waiting",然后调用lock.wait()进入等待状态。接着thread2进入同步代码块,打印"Thread 2 is notifying",然后调用lock.notify()唤醒等待的thread1thread1被唤醒后继续执行,打印"Thread 1 is notified"。

状态图

下面是一个使用mermaid语法的状态图,表示了wait()notify()方法的执行过程。

stateDiagram
    [*] --> Waiting
    Waiting --> Running: notify
    Running --> [*]: wait

结论

通过本文的介绍,我们了解了在Java中如何使用notify()方法来释放锁并唤醒等待的线程。通过合理地使用wait()notify()方法,我们可以实现多线程之间的协同工作,避免竞争和冲突,提高程序的效率和可靠性。希望读者能够通过本文的学习,更加深入地理解Java中的多线程编程和锁机制。