wait
wait和notify方法不是线程对象的方法,也不是通过线程对象调用的。它是Java中任何一个Java对象都有的方法,因为这两个方法是Object类中自带的。
public final native void wait(long timeout) throws InterruptedException;
wait方法表示让线程进入等待状态,直到被唤醒。
final使wait方法无法被重写, ==native ==则是告知jvm该方法在外部定义,也就是会用c语言去实现。
timeout为等待时间,时间到了也会唤醒。但是赋值时间不能为负否则会抛出IllegalArgumentException异常。
注意:它会使当前线程进入等待状态,并释放此对象的锁,故需要使用synchronized同步锁关键字,否则java为使多线程执行顺序不混乱,将抛出IllegalMonitorStateException非法监视器状态异常。若线程在等待前或等待时被中断,当还原此对象的锁定状态后,将抛出InterruptedException异常。所以无论是wait还是notify都依赖于synchronized同步锁。
notify、notifyAll
public final native void notify();
public final native void notifyAll();
notify、notifyAll两个的功能一致,都是唤醒进入等待(wait)的线程。当有多个线程进入等待时notify会随机唤醒一个来获取锁,而notifyAll会唤醒所有的线程来竞争这个锁。只有获取到锁的线程才能往下执行。
注意:配合wait方法使用,并且需要使用synchronized同步锁关键字,否则java为使多线程执行顺序不混乱,将抛出 IllegalMonitorStateException非法监视器状态异常。参考wait方法。
toString
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
将此对象“转换”为字符串,返回 类名 + “@” + 哈希码的十六进制。当我们调用一个对象的引用时实际就是调用了toString方法。由于object中的toString返回的字符串是文本类型的,所以在许多方法中都重写了toString方法可以更好的返回实体类信息。
像String、Date、File、包装类等都重写了Object类中的toString方法
equals
public boolean equals(Object obj) {
return (this == obj);
}
在引用类型中==是比较对象的引用,所以这里的equals是比较对象的引用是否相同。
hashcode
public native int hashCode();
hashcode()方法返回给调用者此对象的哈希码(其值由一个hash函数计算得来)。hashcode通常于equals方法用于一些集合类中如:set、hashMap等。可以更高效的查询、筛选等操作。如果两个值得equals相等则hashcode一定相等,反之不成立。
clone
protected native Object clone() throws CloneNotSupportedException;
该方法叫克隆,是创建对象的方式之一(也可以通过new的方式创建、或者是反射的方式)。
单纯使用clone方法克隆的对象称之为浅克隆,浅克隆共用一份地址也就是两个的对象实例指向堆中的同一个地址,一旦有一个对这个地址内容进行修改相当于另外一个也进行了修改。
深克隆需要重写clone方法、或者使用序列化流来实现。深克隆两个对象指向的地址会不一样避免了浅克隆的问题。
finalize
protected void finalize() throws Throwable { }
已弃用。此方法通常用来释放一些资源,特别是“非堆”资源。
getClass
public final native Class<?> getClass();
getClass与我们经常听到的反射息息相关,利用它可以获得一个实例的class对象从而或者这个对象的类名、成员属性等。反射机制远比我们想像中的更强大,所以需要小伙伴自己去深入了解。
总结
由于能力有限有许多地方理解的还是不够不足之处请大佬指出。