在java线程同步中,使用wait方法有时会导致与预期不符的结果。一个常见的错误是将判断条件放入synchronized块之外。
在给定的示例中,对变量i的判断(i
在这种情况下,即使其中一个线程在wait之后的值为5,也有可能因为判断条件i
立即学习“Java免费学习笔记(深入)”;
为了避免这种情况,需要将判断条件放入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的值,从而保证结果符合预期。