使用wait()方法实现线程同步
在多线程编程中,线程同步是一个重要的概念。当多个线程需要共享资源时,必须确保这些线程按照一定的顺序访问共享资源,以避免数据不一致或竞争条件的发生。
在Java中,可以使用wait()和notify()方法来实现线程同步。wait()方法用于使当前线程进入等待状态,直到其他线程调用notify()方法唤醒它。这样,可以控制线程的执行顺序,实现线程间的同步。
wait()方法通常与synchronized关键字一起使用。synchronized关键字用于锁定某个对象或代码块,确保同一时间只有一个线程可以进入锁定的代码区域。当一个线程进入了synchronized代码区域,并且调用了对象的wait()方法,它会释放对象的锁,并进入等待状态。
其他线程可以继续执行,直到某个条件满足后,调用notify()方法唤醒等待的线程。被唤醒的线程将重新尝试获取对象的锁,然后继续执行。
下面是一个简单的例子,演示如何使用wait()方法实现线程同步:
class SharedResource {
private boolean flag = false;
public synchronized void waitMethod() {
while (!flag) {
try {
wait(); // 线程进入等待状态
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 执行线程需要同步的操作
System.out.println("Thread is executing.");
flag = false;
notify(); // 唤醒其他等待的线程
}
public synchronized void notifyMethod() {
while (flag) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 执行线程需要同步的操作
System.out.println("Thread is notifying.");
flag = true;
notify();
}
}
class MyThread implements Runnable {
private SharedResource resource;
public MyThread(SharedResource resource) {
this.resource = resource;
}
public void run() {
resource.waitMethod();
}
}
public class ThreadSyncExample {
public static void main(String[] args) {
SharedResource resource = new SharedResource();
Thread thread1 = new Thread(new MyThread(resource));
Thread thread2 = new Thread(new MyThread(resource));
thread1.start(); // 线程1进入等待状态
thread2.start(); // 线程2进入等待状态
}
}
上述代码中,SharedResource类表示共享资源,其中的waitMethod()方法和notifyMethod()方法分别实现了等待和唤醒的逻辑。MyThread类实现了Runnable接口,并在其中调用了waitMethod()方法。
ThreadSyncExample类是程序的入口,创建了两个线程并启动它们。当线程启动后,它们会调用资源对象的waitMethod()方法并进入等待状态。
在waitMethod()方法中,线程会一直等待,直到其他线程调用了notify()方法。被唤醒的线程会重新尝试获取资源对象的锁,并继续执行。这样就实现了线程间的同步。
使用wait()方法实现线程同步可以避免线程之间的竞争条件和数据不一致问题。它是Java多线程编程中常用的一种同步机制。
总结起来,wait()方法和notify()方法配合使用,可以实现线程的等待和唤醒。通过合理的使用这两个方法,可以控制线程的执行顺序,从而达到线程同步的目的。



