解读java.lang包下Object类的API(二)

一、notify()

public final native void notify();

从对象所有等待中的线程选择一个线程,让他开始执行

     一般与wait() synchronized搭配使用

     只能由作为此对象监视器的所有者调用

     线程程可以成为此对象监视器的所有的方法:

              1.通过执行此对象的同步实例方法

              2.通过执行在此对象上进行同步的synchronized语句的正文

              3.对于Class类型的对象,可以通过执行该类的同步同步静态方法

          一次只能有一个线程拥有对象的监视器

  当当前线程不是此对象监视器的所有者时,会抛出IllegalMonitorStateException

二、notifyAll()

public final native void notifyAll();

     唤醒对象监视器上等待的所有线程

     唤醒的线程在作为锁定此对象的下一个线程方面没有可靠的特权或劣势。

     只能由作为此对象监视器的所有者调用

     当当前线程不是此对象监视器的所有者时,会抛出IllegalMonitorStateException

三、wait(long timeout)

public final native void wait(long timeout) throws InterruptedException;

     表示在其他线程notify()或者notifyAll()方法调用前或者超过的指定时间前 当前线程等待

     参数 timeout:要等待的最长时间,毫秒值

        在此之前若被释放则不必等到最长时间,若再次之前没有被释放则需等到最长时间后被释放

        timeout值为0时,则不考虑实际时间,获得通知前,线程一直等待


     此方法会将当前线程将其自身放置在对象的等待集中,放弃所有同步要求,线程调度时,在出现以下几种情况前,线程被禁用,出于休眠状态

          1.其他某个线程调用此对象的notify方法,并且线程碰巧被任选为被唤醒线程

          2.其他某个线程调用此对象的notifyAll方法

          3.其他某个线程中断此线程

          4.到达timeout设置的时间

以上方法从等待集中删除线程,并重新进行调度,随机唤醒,一旦获得对该对象的控制权,该对象的所有同步声明都恢复到以前状态

  在没有被通知、终端、或超时的情况,线程还可以唤醒一个虚假唤醒(spurious wakeup),此情况虽然很少发生,

  使用以下方法防止其发生

          synchronized (obj) {while ()

                obj.wait(timeout);

                ... // Perform action appropriate to condition

           }

    说明:对应该导致该线程提醒的条件进行测试,如果不满足条件,则继续等待,等待发生在循环中。


    注意:

    1.由于 wait 方法将当前线程放入了对象的等待集中,所以它只能解除此对象的锁定;可以同步当前线程的任何其他对象在线程等待时仍处于锁定状态。

    2.当当前线程不是此对象监视器的所有者时,会抛出IllegalMonitorStateException

    3.当timeout值为负值时,抛出IllegalArgumentException

    4.当前线程等待通知之前或者正在等待通知时,任何线程中断了当前线程,抛出InterrupteException;抛出此异常时,线程的“等待状态”被清除

四、wait(long timeout, int nanos)

public final void wait(long timeout, int nanos) throws InterruptedException {

        if (timeout < 0) {

            throw new IllegalArgumentException("timeout value is negative");

        }

        if (nanos < 0 || nanos > 999999) {

            throw new IllegalArgumentException(

                                "nanosecond timeout value out of range");

        }

        if (nanos > 0) {

            timeout++;

        }

        wait(timeout);

    }

     类似于一个参数的wati方法,但是可以更好的控制在放弃之前的等待时间,精确到毫微秒 实际时间为:1000000*timeout+nanos(毫微秒)      wait(0,0)与wait(0) 作用相同

      此方法会将当前线程将其自身放置在对象的等待集中,放弃所有同步要求,线程调度时,在出现以下几种情况前,线程被禁用,出于休眠状态

            1.其他线程通过调用notify,notifyAll通知此对象监视器上的县城醒来

            2.timeout毫秒值与nanos毫微秒值之和指定的时间已用完

      在此之后,线程等待重新获得对监视器的所有权后才能继续执行


      在没有被通知、终端、或超时的情况,线程还可以唤醒一个虚假唤醒(spurious wakeup),此情况虽然很少发生,

     使用以下方法防止其发生

               synchronized (obj) {while ()

                    obj.wait(timeout);

                    ... // Perform action appropriate to condition

                    }

      说明:对应该导致该线程提醒的条件进行测试,如果不满足条件,则继续等待,等待发生在循环中。


    参数:timeout 等待的最长时间 毫秒 nanos 额外时间 毫微秒(0-999999)

注意:

        1.如果超时值是负数,或者毫微秒值不在 0-999999 范围内,抛出IllegalArgumentException

        2.如果当前线程不是此对象监视器的所有者,抛出IllegalMonitorStateException。

        3.当前线程等待通知之前或者正在等待通知时,任何线程中断了当前线程,抛出InterrupteException;抛出此异常时,线程的“等待状态”被清除

五、wait()

   public final void wait() throws InterruptedException {

        wait(0);

    }

      作用同wait(0)

      在没有被通知、终端、或超时的情况,线程还可以唤醒一个虚假唤醒(spurious wakeup),此情况虽然很少发生,

     使用以下方法防止其发生

           synchronized (obj) {while ()

                    obj.wait(timeout);

                    ... // Perform action appropriate to condition

             }

       说明:对应该导致该线程提醒的条件进行测试,如果不满足条件,则继续等待,等待发生在循环中。

      注意:

          1.如果当前线程不是此对象监视器的所有者,抛出IllegalMonitorStateException。

          2.当前线程等待通知之前或者正在等待通知时,任何线程中断了当前线程,抛出InterrupteException;抛出此异常时,线程的“等待状态”被清除

六、finalize()

protected void finalize() throws Throwable { }


     当垃圾回收器确定不存在对该对象的更多引用是, 由对象的垃圾回收器调用此方法,进行垃圾回收


     finalize常规协定:

        当java虚拟机已确定尚未终止的任何线程无法再通过任何方法访问此对象时,将调用此方法,除非由于准备终止的某个对象或类的终结操作执行了某个操作

        finalize的主要目的是在不可撤销的丢弃对象之前执行清除操作,例如,表示输入/输出连接的对象的 finalize 方法可执行显式 I/O 事务,以便在永久丢弃对象之前中断连接。


        Java 编程语言不保证哪个线程将调用某个给定对象的 finalize 方法。但可以保证在调用 finalize 时,调用 finalize 的线程将不会持有任何用户可见的同步锁定。

     如果 finalize 方法抛出未捕获的异常,那么该异常将被忽略,并且该对象的终结操作将终止。

        在启用某个对象的 finalize 方法后,将不会执行进一步操作,直到 Java 虚拟机再次确定尚未终止的任何线程无法再通过任何方法访问此对象,

        其中包括由准备终止的其他对象或类执行的可能操作,在执行该操作时,对象可能被丢弃。

        对于任何给定对象,Java 虚拟机最多只调用一次 finalize 方法。

        finalize 方法抛出的任何异常都会导致此对象的终结操作停止,但可以通过其他方法忽略它。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Java中的Object类是所有类的父类,它提供了以下11个方法: public final native Cla...
    CHSmile阅读 531评论 0 0
  • Object类位于java.lang包中,java.lang包有最基础的和核心的类,在编译时会自动导入; Obje...
    遇见你的故事阅读 667评论 0 0
  • 在一个方法内部定义的变量都存储在栈中,当这个函数运行结束后,其对应的栈就会被回收,此时,在其方法体中定义的变量将不...
    Y了个J阅读 4,459评论 1 14
  • 一、扑克编码的方式 用一个两位数对每张扑克进行编码,花色和点数分开编码。 数字牌:花色代表两位数的十位,点数代表两...
    海淘小公主Princess阅读 1,675评论 0 49
  • 我渐渐相信,生活在世界上的每个人都由灵魂和肉体两个部分组成。 从灵魂和肉体对人所起作用的主从关系来看,我认为肉体完...
    梦想2050阅读 693评论 3 9