码迷,mamicode.com
首页 > 编程语言 > 详细

JDK1.8源码阅读-java.lang.Object.java

时间:2018-10-29 16:55:34      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:notifyall   怎么   对象锁   mon   其他   情况   nano   垃圾回收   随机   

1.getClass()
public final native Class<?> getClass();
获得的是变量实际的类型,比如
技术分享图片
得到的输出结果是 hashmap。
getClass 获得的实际类型是Class<? extends |X|> 其中X是变量声明时的类型
 
 
2.hashCode()
一个对象中无论被调用多少次,都会返回同一个值。以保证不会影响equals()的比较结果。但是在两次不同的运行中,不能保证相同的hashCode。(挺好理解的,就是在一次)
 
3.equals()
对象应当满足:
1.自反性(a.equals(a)返回true)
2.对称性(a.equals(b)返回true,则 b.equals(a)也返回true)
3.传递性(a.equals(b)==true,b.equals(c)==true,则a.equals(c)==true)
4.持续性,一日相等终生相等
 
 
4.clone()
为了保证复制出的对象的独立性,通常是需要修改复制出来对象的几个域。这意味着如果复制的对象比较复杂(具有比较深的对象结构),那么将会把对这个对象的引用改成对它的备份的引用。
1.如果这个对象的类本身没有实现Cloneable接口的话,将会抛出异常CloneNotSupportedException。
2.这个方法产生的对象是浅拷贝(创建一个新对象,初始化它的所有类,并且赋值上与原对象一样的值,所以只是值相同的浅拷贝),而不是深拷贝。、
 
5.toString()
默认返回 类名@哈希值。建议所有的类都重写这个方法,返回属于自己的toString值。
 
6.notify()
唤醒单个线程,如果有多个线程正在等待唤醒,那么这个线程是随机选择的。
只有锁的拥有者才可以调用这个方法。那么怎么拥有锁呢?只有三个方法可以获得锁:
1.执行对象中的某个同步方法(对象锁)
2.执行某个同步代码段(对象锁)
3.执行某个静态同步方法(类锁)
那么如果不是锁的拥有者调用这个方法呢?会抛出IllegalMonitorStateException异常。
 
7.notifyAll()
与notify()功能基本一致,只是唤醒的是所有线程。
 
8.wait(long timeout)
当前锁的拥有者,放弃已经获取的所有锁,进入休眠并不可用。只有四种情况能打断:
1.某个线程调用了该对象的notify方法,并且刚好被选中。
2.某个线程调用了notifyAll()方法
3.某个线程调用了interrupt()方法中断了这个线程的阻塞状态,抛出InterruptedException异常后,继续正常运行。
4.等待时间到了。不过如果传入的timeout为0,则timeout无效,该线程只能靠notify唤醒
以上的四种情况,都可以打断线程的wait状态。
如果timeout小于0,则抛出IllegalArgumentException。
如果当前线程不是线程锁的拥有者,则抛出IllegalMonitorStateException。
如果被Interrupt()方法唤醒,则抛出InterruptedException
 
9.wait(long timeout, int nanos)
比起wait(timeout)方法,通过第二个参数nanos,提供了更细粒度的控制。nanos指的是纳秒的数量。
 
10.wait()
就像是传wait(0),就没有等待时间,只有八其中的1.2.3三个场景能打断。
 
11.finalize()
当一个对象没有任何引用时,它的finialize()方法将会在垃圾回收时被垃圾回收器调用。一般子类应该重写这个方法来处理系统资源或执行其他清理(少数情况下,可能会执行某些操作让这个对象再被其他线程的对象所引用到)。
JAVA不保证调用这些对象的finalize()方法,但是保证一旦调用的时候,调用该方法的线程不会持有任何用户可见的同步锁。并且这个方法内即使有不被捕获的异常,那些异常也会被忽略,对象的终结过程被终止,这个对象进入被破坏状态。
在调用了一个对象的finalize()方法后,不会采取进一步的动作。直到JVM确保没有任何线程可以访问到该对象之后,包括任何可能的动作或类,这个对象才会被丢弃。
在finalize中的任何异常都会导致finalize这个行动被中断,但是这些异常都会被忽略掉。忽略掉的意思指的是程序会正常运行,不会受影响。但是finalize这个行动已经停了下来,而对象也进入被破坏状态。
 

JDK1.8源码阅读-java.lang.Object.java

标签:notifyall   怎么   对象锁   mon   其他   情况   nano   垃圾回收   随机   

原文地址:https://www.cnblogs.com/better-be-better/p/9871377.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!