运行结果为:
  1 main thread 等待t线程执行完
  2 Thread name is:Thread-0
  3 执行notif后同步代码块中依然可以继续执行直至完毕
  4 执行notif后且同步代码块外的代码执行时机取决于线程调度  //此行输出位置有具体的JVM线程调度决定,有可能后执行
  5 被notity唤醒,得以继续执行
  6 线程t执行相加结果45
  复制代码
  既然是作用于多线程中,为什么却是Object这个基类所具有的方法?原因在于理论上任何对象都可以视为线程同步中的监听器,且wait(...)/notify()|notifyAll()方法只能在同步代码块中才能使用。
  从上述例子的输出结果中可以得出如下结论:
  1、wait(...)方法调用后当前线程将立即阻塞,且适当其所持有的同步代码块中的锁,直到被唤醒或超时或打断后且重新获取到锁后才能继续执行;
  2、notify()/notifyAll()方法调用后,其所在线程不会立即释放所持有的锁,直到其所在同步代码块中的代码执行完毕,此时释放锁,因此,如果其同步代码块后还有代码,其执行则依赖于JVM的线程调度。
  在Java源码中,可以看到wait()具体定义如下:
  1  public final void wait() throws InterruptedException {
  2      wait(0);
  3  }
  且wait(long timeout, int nanos)方法定义内部实质上也是通过调用wait(long timeout)完成。而wait(long timeout)是一个native方法。因此,wait(...)方法本质上都是native方式实现。
  notify()/notifyAll()方法也都是native方法。
  Java中线程具有较多的知识点,是一块比较大且重要的知识点。后期会有博文专门针对Java多线程作出详细总结。此处不再细述。
  13. protected void finalize();
  finalize方法主要与Java垃圾回收机制有关。首先我们看一下finalized方法在Object中的具体定义:
  1 protected void finalize() throws Throwable { }
  我们发现Object类中finalize方法被定义成一个空方法,为什么要如此定义呢?finalize方法的调用时机是怎么样的呢?
  首先,Object中定义finalize方法表明Java中每一个对象都将具有finalize这种行为,其具体调用时机在:JVM准备对此对形象所占用的内存空间进行垃圾回收前,将被调用。由此可以看出,此方法并不是由我们主动去调用的(虽然可以主动去调用,此时与其他自定义方法无异)。
  JVM垃圾回收机制是Java中重点的一块内容,在以后的博文中也将会详细总结。