java-解读Object类

环境 jdk.1.8

Object是类层次结构的根,所有对象,包括数组,都实现这个类的方法。下面开始逐步解读它的方法

返回此{代码对象}的运行时Class,返回static synchronized锁定的object,
实际返回的对象是调用表达式的静态类型的擦除,不需要强制转换

  public final native Class<?> getClass();

返回对象的哈希代码值,有利于支持hasb表,
每当同一对象上多次调用时,必须始终返回相同的整数
确实返回不同的整数来区分对象。(通常通过转换内部来实现),将对象的地址转换成整数,不通过java语言实现

    public native int hashCode();

指示其他对象是否等于“此”
反射
对称
传递性
一致性
通常需要重写hashCode方法,相等的对象必须具有相等的哈希代码。

    public boolean equals(Object obj) {
        return (this == obj);
    }

返回对象的字符串表示形式,建议所有子类重写此方法,返回hashCode的无符号十六进制表示形式。

public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

唤醒正在等待此对象的单个线程在对象的监视器,如果有任何线程正在等待这个对象,其中一个
选择被唤醒。选择是随意的,自行决定,线程在对象上等待。通过调用wait方法中的一个。
唤醒的线程将无法继续,直到当前线程放弃这个对象上的锁,觉醒的线程将以通常的方式与任何其他线程竞争
主动竞争以同步此对象,觉醒的线程不存在可靠的特权或不利于锁定此对象的下一个线程,此方法只应由对象监视器的所有者的线程调用。

线程成为对象的监视器有以下三种方式之一:
通过执行该对象的同步实例方法。
通过执行该对象的同步代码块
通过执行该类的同步静态方法。

某个时刻只有一个线程可以拥有对象的监视器

如果当前线程不是这个对象的监视器的所有者,则抛出IllegalMonitorStateException

 public final native void notify();

唤醒在这个对象的监视器上等待的所有线程。一个线程在对象的监视器上等待,通过调用其中一个wait方法。唤醒的线程将无法继续,直到当前线程放弃这个对象上的锁。觉醒的线程将以通常的方式与其他可能的线程竞争,积极竞争以同步此对象。觉醒的线程不存在可靠的特权或不利于锁定此对象的下一个线程,此方法只应由对象监视器的所有者的线程调用。
如果当前线程不是这个对象的监视器的所有者,则抛出IllegalMonitorStateException

    public final native void notifyAll();

使当前线程等待,直到另一个线程调用notify或者notifyall 或指定的时间量已经过去。
当前线程必须拥有该对象的监视器。此方法导致当前线程放置在这个对象的等待集合中,然后放弃此对象上的所有同步声明,由于线程不可用于线程调度的目的,处于休眠状态,直到下列四种情况发生:

1、一些其他线程在此对象上调用{@notify}方法,线程碰巧被任意选择为要唤醒的线程,
2、一些其他线程在此对象上调用{@代码notifyAll}方法
3、其他线程调用 Thread#interrupt()中断线程
4、已经过了指定的时间,或多或少。如果timeout为零,但不考虑实时。线程只是等待,直到notify

然后该线程从此对象的等待集合中删除线程,重新启用线程调度,然后它在竞争中通常的方式与其他线程的权利同步对象,一旦它获得对象的控制,所有的对象上的同步请求恢复到当前状态
也就是说,到达指定时间,wait方法被调用,对象和对象的同步状态与wait方法完全一样。

线程也可以在未被通知、中断或唤醒、超时的情况下醒来,即所谓的“假唤醒”,虽然这很少
发生在实践中,应用程序必须通过测试来防范它,通过应该引起线程被唤醒的条件,如果条件不满足,继续等待,换言之,等待应该总是发生在循环中

synchronized (obj) {
     while (&lt;condition does not hold&gt;)
            obj.wait(timeout);
           ... // Perform action appropriate to condition
    }

如果当前线程被其他线程中断在等待之前或正好在等待,InterruptedException被抛出,
这个异常不会被抛出,直到该对象的锁定状态已恢复为如上所述。

当它放置当前线程到该对象的等待集合中,仅解锁该对象;
任何其他对象在当前线程上仍然同步锁定当当前线程等待时

此方法只应由拥有这个对象的监视器的线程调用。
参数
timeout the maximum time to wait in milliseconds.
IllegalArgumentException if the value of timeout is
* negative.
IllegalMonitorStateException if the current thread is not
* the owner of the object’s monitor.
InterruptedException if any thread interrupted the
* current thread before or while the current thread
* was waiting for a notification. The interrupted
* status
of the current thread is cleared when
* this exception is thrown.

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

使当前线程等待,直到另一线程调用 {@链接java。Object # notify() }法或{@链接java。此对象Object # notifyall() }方法。
当前线程必须拥有该对象的监视器。线程释放该监视器的所有权并等待直到另一线程通知等待此对象监视器的线程唤醒,通过notify或者notifyAll,然后线程等待,直到它能够重新获得监视器的所有权并恢复执行。
在一个参数版本中,中断和虚假唤醒是可能的,并且这个方法应该总是在循环中使用

synchronized (obj) {
     while (&lt;condition does not hold&gt;)
                 obj.wait();
              ... // Perform action appropriate to condition
     }

此方法只应由所有者的线程调用

@throws IllegalMonitorStateException if the current thread is not
* the owner of the object’s monitor.
* @throws InterruptedException if any thread interrupted the
* current thread before or while the current thread
* was waiting for a notification. The interrupted
* status
of the current thread is cleared when
* this exception is thrown.

  public final void wait() throws InterruptedException {
        wait(0);
    }

垃圾回收时对象被垃圾回收器调用,确定不再有对对象的引用。子类重写{@代码final}方法以处理系统资源或执行其他清理。一般契约是它被调用如果java虚拟贸易;机器已经确定不再有任何该对象可以通过任何线程访问该对象
尚未死亡,只是由于采取的行动完成一些其他对象或类,准备好了最后确定。{@代码终结}方法可以采取任何行动,包括
使此对象再次可用于其他线程;通常的用途然而,{@代码终结}是在执行清理操作之前这个对象是不可撤消的。例如,最终化方法
表示输入/输出连接的对象可能执行在对象之前中断连接的显式I/O事务,永久丢弃,final方法不执行特殊行动;它只是正常返回。子类可以重写此定义。
java编程语言不保证该线程将为任何给定对象调用{@代码终结}方法。它是保证,调用终结的线程将不会
在终结时保持任何用户可见的同步锁调用。如果未完成的异常由FIALLID方法引发,忽略该异常并终止该对象的终结。
对于对象调用了{@代码终结}方法后,没有进一步采取行动,直到java虚拟机再次确定该对象不再有任何手段任何尚未死亡的线程访问,包括可能其他已准备好完成的对象或类的动作,在该点,对象可以被丢弃。final方法最多只调用一次java任何给定对象的虚拟机。{@代码终结}方法引发的任何异常终止此对象的终结,但以其他方式结束
@throws Throwable the {@code Exception} raised by this method

 protected void finalize() throws Throwable { }

猜你喜欢

转载自blog.csdn.net/qq_16038125/article/details/80317339
今日推荐