概述
- 顶级父类
常规方法
private static native void registerNatives();
static {
registerNatives();
}
- 对象运行时类类型
public final native Class<?> getClass();
- 非覆盖情况下,返回对象地址;覆盖时与equals保持一致
public native int hashCode();
- 非覆盖情况下比较JVM地址值
public boolean equals(Object obj) {
return (this == obj);
}
-
约定:equals的对象,hashCode必等;反之实现为佳,但hash算法不佳时,难免碰撞
-
拷贝生成对象副本,常规约定下
- x.clone() != x
- x.clone().getClass() == x.getClass()
- x.clone().equals(x)
-
涉及深拷贝时最后一条不一定满足
-
必须实现Cloneable接口方可调用clone方法,否则抛CloneNotSupportedException
protected native Object clone() throws CloneNotSupportedException;
- 返回对象的描述信息
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
锁相关方法
- 唤醒
// 随机唤醒
public final native void notify();
// 唤醒全部
public final native void notifyAll();
- 休眠
// 释放锁,休眠
public final native void wait(long timeout) throws InterruptedException;
- 唤醒方式
- notify + 高RP
- notifyAll
- 其他线程中断该线程,先重置中断位状态,再抛InterruptedException
- 等待时间耗光;时间设为0,代表一直等待
- spurious wakeup假唤醒
- 为避免这种极少出现但可能出现的情况对应用的影响,需要将wait放在循环里,即wait条件还达到的话,就不断执行wait
synchronized (obj) {
while (<condition does not hold>;)
obj.wait(timeout);
// Perform action appropriate to condition
}
gc相关
- gc时会用一个低优先级线程去调,只会调用一次
- 会保证被调用,但无法保证执行完毕,如果卡死什么的,会直接被JVM中断
- 初期作为C++析构函数的一种折中,其实并不建议使用
protected void finalize() throws Throwable { }
网友评论