JDK源码学习——Object

JDK源码学习——Object,第1张

JDK源码学习——Object

1. registerNatives

通常,为了让JVMfind你的本地函数,它们必须以某种方式命名。 例如,对于java.lang.Object.registerNatives ,相应的C函数被命名为Java_java_lang_Object_registerNatives 。 通过使用registerNatives (或者说JNI函数RegisterNatives ),你可以任意命名你的C函数。

2.native
        native是与C++联合开发的时候用的!使用native关键字说明这个方法是原生函数,也就是这个方法是用C/C++语言实现的,并且被编译成了DLL,由java去调用。 这些函数的实现体在DLL中,JDK的源代码中并不包含,你应该是看不到的。对于不同的平台它们也是不同的。这也是java的底层机制,实际上java就是在不同的平台上调用不同的native方法实现对 *** 作系统的访问的。总而言之:

native 是用做java 和其他语言(如c++)进行协作时使用的,也就是native 后的函数的实现不是用java写的。
原文链接:https://blog.csdn.net/flyingdog123/article/details/80419911

 private static native void registerNatives();
    static {
        registerNatives();
    }

3.getClass()

Object getClass() 方法用于获取对象的运行时对象的类。
public final native Class getClass();

4.hashCode()

hashCode()方法用于返回字符串的哈希码

public native int hashCode();

5.equals()

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

6.clone()

常见的Object a=new Object();Object b;b=a;这种形式的代码复制的是引用,即对象在内存中的地址,a和b对象仍然指向了同一个对象。而通过clone方法赋值的对象跟原来的对象时同时独立存在的。详细见以下博客。

JAVA 中的的clone()详解_大鱼的翅膀-CSDN博客

 protected native Object clone() throws CloneNotSupportedException;

7.toString()

toString() 方法用于返回以一个字符串表示的 Number 对象值。

如果方法使用了原生的数据类型作为参数,返回原生数据类型的 String 对象值。

如果方法有两个参数, 返回用第二个参数指定基数表示的第一个参数的字符串表示形式。

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

8.notify()

Object notify() 方法用于唤醒一个在此对象监视器上等待的线程

如果所有的线程都在此对象上等待,那么只会选择一个线程,选择是任意性的,并在对实现做出决定时发生。

一个线程在对象监视器上等待可以调用 wait() 方法。

notify() 方法只能被作为此对象监视器的所有者的线程来调用。

一个线程要想成为对象监视器的所有者,可以使用以下 3 种方法:

  • 执行对象的同步实例方法
  • 使用 synchronized 内置锁
  • 对于 Class 类型的对象,执行同步静态方法

一次只能有一个线程拥有对象的监视器。

如果当前线程不是此对象监视器的所有者的话会抛出 IllegalMonitorStateException 异常。

线程学习:Java线程详解(深度好文)_yjsz2010的专栏-CSDN博客_java线程

public final native void notify();

9. notifyAll()

bject notifyAll() 方法用于唤醒在该对象上等待的所有线程。

notifyAll() 方法跟 notify() 方法一样,区别在于 notifyAll() 方法唤醒在此对象监视器上等待的所有线程,notify() 方法是一个线程。

如果当前线程不是对象监视器的所有者,那么调用 notifyAll() 方法同样会发生 IllegalMonitorStateException 异常。

public final native void notifyAll();

10.wait(long timeout)

Object wait(long timeout) 方法让当前线程处于等待(阻塞)状态,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过参数 timeout 设置的超时时间。

如果 timeout 参数为 0,则不会超时,会一直进行等待,类似于 wait() 方法。

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

11. wait(long timeout, int nanos)

Object wait(long timeout, int nanos) 方法让当前线程处于等待(阻塞)状态,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过参数 timeout 与 nanos 设置的超时时间。

该方法与 wait(long timeout) 方法类似,多了一个 nanos 参数,这个参数表示额外时间(以纳秒为单位,范围是 0-999999)。 所以超时的时间还需要加上 nanos 纳秒。

如果 timeout 与 nanos 参数都为 0,则不会超时,会一直进行等待,类似于 wait() 方法。

 public final void wait(long timeout, int nanos) throws InterruptedException {
        if (timeout < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }

        if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {
            timeout++;
        }

        wait(timeout);
    }

12.wait()

Object wait() 方法让当前线程进入等待状态。直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。

当前线程必须是此对象的监视器所有者,否则还是会发生 IllegalMonitorStateException 异常。

如果当前线程在等待之前或在等待时被任何线程中断,则会抛出 InterruptedException 异常。

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

13.finalize()

Object finalize() 方法用于实例被垃圾回收器回收的时触发的 *** 作。

当 GC (垃圾回收器) 确定不存在对该对象的有更多引用时,对象的垃圾回收器就会调用这个方法。

protected void finalize() throws Throwable { }

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5563224.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存