Java线程同步中wait方法导致结果异常的原因是什么

java线程同步中wait方法导致意外结果的原因

在java线程同步中,使用wait方法有时会导致与预期不符的结果。一个常见的错误是将判断条件放入synchronized块之外。

在给定的示例中,对变量i的判断(i

在这种情况下,即使其中一个线程在wait之后的值为5,也有可能因为判断条件i

为了避免这种情况,需要将判断条件放入synchronized块内。通过将判断条件放在synchronized

块中,我们可以确保线程在进入循环时不会有其他线程修改i的值。

修改后的numplus1类代码如下:

public class NumPlus1 implements Runnable {
    int i = 0;

    @Override
    public void run() {
        Thread now = Thread.currentThread();
        while (true) {
            synchronized (this) {
                if (i < 5) {
                    System.out.println(now.getName() + ":" + i++);
                    try {
                        wait(1000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        }
    }
}

通过将判断条件放入synchronized块内,我们可以确保线程在每次进入循环时都会检查i的值,从而保证结果符合预期。