private static native void registNatives();
百度了半天也只是一个关于底层的方法,不是我所能触及。大致是将wait、notify、notifyAll、clone、hashCode本地方法进行注册(初始化Java方法到C的方法)。有多类都有这个方法,但是执行注册的目标是不同的。System中也有这个方法,但是它注册的是另一些方法。
public final native Class<?> getClass();
getClass()是一个本地方法,返回一个对象的类型。
public native int hashCode();
hashCode()返回一个散列值(哈希值),通过散列值找到哈希桶(bucket)中存储Entry对象的位置。
public boolean equals(Object obj);
equals()是Object类的方法,用于比较对象是否相等,没有重写的情况下,默认比较两个对象的相等。如果一个类重写了
equals()方法,那么根据具体需求判断两个对象是否相等的条件,在equals()中,不止可以判断属性相等,还可以在属性相等或不相等的情况下做出业务扩展。
重写equals()时有必要重写hashCode,以便维护hashCode的契约:
当obj1.equals(obj2)为true时,obj1.hashCode() == obj2.hashCode()必须为true
当obj1.hashCode() == obj2.hashCode()为false时,obj1.equals(obj2)必须为false
public native Object clone () throws CloneNotSupportedException;
clone是实现对象的复制,而这个副本对象应当尽可能独立。就是在堆中的地址不同。为了实现这样的目的,在spuer.
clone返回对象之前,需要修改对象的一个字段或者多个字段(就是对象中的其他类型引用所引用的对象应该一起被复制)。这就是深度拷贝。浅度拷贝就是拷贝原始字段和不可变对象。
public String toString();
toString()经常重写,返回字符串对象,用于打印成员变量的信息。
publicnative final wait() throws InterruptedException;
public native final wait(long timeout) throws InterruptedException;
public native final wait( long timeout, int nanos) throws InterruptedException;
public native final void notify();
public native final void notifyAll()
以上五个方法是实现对象中线程同步机制。通过对象锁或者类锁操作(也就是需要在sychronized同步代码块中使用),实现多线程并发执行时在共享数据集上的互斥与协作。
当执行到wait(),将线程改为睡眠状态,当调用了notify或者notifyAll,才会唤醒线程,继续执行。
wait()是将当前同步代码块的对象锁锁释放,暂时交给其他线程使用,wait等待,就是等待拿回类中其他同步代码块中的对象锁。wait()有两个重载方法:
wait(long timeout):lang类型参数,申明最长的等待时间(以毫秒为单位),时间一到将收回对象锁
wait(long timeout,int nanos)有一个long类型参数,和int参数,long类型参数申明最长的等待时间(以毫秒为单位),int类型声明额外等待时间以纳秒为单位在0-99万之间。
notify和notifyAll没有什么区别,notify()是唤醒当前对象监听器上等待的一个线程。notifyAll()是唤醒当前对象监听器上等待的所有线程。
protected void finalize () throwable;
当垃圾回收器要回收垃圾对象时会调用此方法,实现资源释放。子类可以重写此方法,让程序运行时按照定义去实现对象回收。