synchronized

如果一个线程进入到synchronized方法修饰的对象,那么它将会获得这个对象的唯一一把锁(monitor),在线程没有释放这把锁,其他线程是无法访问到该方法中的。该线程会执行完synchronized方法块后释放对象锁

wait、notify

wait()方法执行前提是当前线程必须拥有对象锁,只有线程进入synchronized方法块内才能拿到对象锁,所以wait()一定是在synchronized块内。wait()是让调用此方法的线程释放对象锁并将自己挂起等待。

当其他线程调用此对象的notify()或notifyAll()方法时,系统会在当前挂起的(等待在wait方法)多个线程中,随机唤醒一个,被唤醒的线程会等待直到拿到对象锁并急需执行。

应用程序需要防范线程被唤醒的”瞬间”是否仍满足执行条件,如果不满足仍应”等待”。wait范式如下:

  1. synchronized (obj) {
  2. while (<condition does not hold>) {
  3. obj.wait(timeout);
  4. }
  5. ... // Perform action appropriate to condition
  6. }