wait()方法对wait()方法的调用必须放在synchronized方法或同步块中。 对于当前线程已经获取监视器的对象,必须调用wait()方法。 notify()方法没有办法唤醒等待集中的特定线程。 例子public class Main { private static int myValue = 1;
public static void main(String[] args) { Thread t = new Thread(() -> { while (true) { updateBalance(); } }); t.start(); t = new Thread(() -> { while (true) { monitorBalance(); } }); t.start(); }
public static synchronized void updateBalance() { System.out.println("start:" + myValue); myValue = myValue + 1; myValue = myValue - 1; System.out.println("end:" + myValue); }
public static synchronized void monitorBalance() { int b = myValue; if (b != 1) { System.out.println("Balance changed: " + b); System.exit(1); } } }
上面的代码生成以下结果。 例2以下代码显示了上述代码的非同步版本。 public class Main { private static int myValue = 1;
public static void main(String[] args) { Thread t = new Thread(() -> { while (true) { updateBalance(); } }); t.start(); t = new Thread(() -> { while (true) { monitorBalance(); } }); t.start(); }
public static void updateBalance() { System.out.println("start:" + myValue); myValue = myValue + 1; myValue = myValue - 1; System.out.println("end:" + myValue); }
public static synchronized void monitorBalance() { int b = myValue; if (b != 1) { System.out.println("Balance changed: " + b); System.exit(1); } } }
上面的代码生成以下结果。 |