JDK1.8源码学习(Object)

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对象从而或者这个对象的类名、成员属性等。反射机制远比我们想像中的更强大,所以需要小伙伴自己去深入了解。

总结

由于能力有限有许多地方理解的还是不够不足之处请大佬指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值