public class Object { private static native void registerNatives(); static { registerNatives(); } public final native Class<?> getClass(); public native int hashCode(); public boolean equals(Object obj) { return (this == obj); } 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; 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); } public final void wait() throws InterruptedException { wait(0); } protected void finalize() throws Throwable { } }
其中对一些方法加以分析。
1. equals()与hashCode()的问题
1)equals()相等,那么hashCode()一定是相等的;
2)hashCode()相等,equals()不一定相等。
2. finalize()在什么时候会出现呢?
当JVM进行垃圾回收时,会调用复写的finalize()的方法,所以不是你一调用的GC后它就会
立马被调用,时刻不是我们所控制的。
3. 线程互斥控制
线程的同步与互斥是一个很重要的问题,也会有不同的方式来实现。在java中,为解决竞争共享资源时而产生的数据不一致性,java也提供了一些方式来处理,如同步代码块,同步函数。它们的原理是每个对象都会有一个计数器,当进入临界区时,会检查这个计数器,如果为0,说明临界资源没有被使用,自己可以使用;反之,不为0说明有人在使用,自己要等待,同时将计数器加1.
4. notify vs notifyAll
notify和notifyAll都是把某个对象上休息区内的线程唤醒,notify只能唤醒一个,但究竟是哪一个不能确定,而notifyAll则唤醒这个对象上的休息室中所有的线程.
5. wait
注意一点,它会释放锁的。
6.同步与互斥
syschronized是用于互斥的,而wait和nofity是用于同步的。著名的消费者生产者就是使用这两个结合的经典案例。