JavaSE之面向对象 (1)

1、wait方法底层原理

wait是object中的方法,可以暂停线程,会释放对象锁,不像sleep方法,线程休眠期依然持有锁,通过调用notify或notifyAll方法唤醒线程。

lock.wait()方法最终通过ObjectMonitor的wait()方法实现:

  1. 将当前线程封装成ObjectWaiter对象node;
  2. 通过ObjectMonitor的AddWaiter方法将node添加到WaitSet列表中;
  3. 通过ObjectMonitor的exit方法释放当前的ObjectMonitor对象,这样其它竞争线程就可以获取该ObjectMonitor对象。

ObjectMonitor对象中有两个队列:WaitSet和EntryList:

  • WaitSet:处于wait状态的线程,会被加入到WaitSet;
  • EntryList:处于竞争锁状态的线程,会被加入到EntryList。

2、Java有哪些特性,举个多态的例子。

封装、继承、多态;

举例:方法重载、父类型引用子类对象。

3、String为啥不可变?

因为String类源码定义的是一个private final修饰的名为value的字符数组;被final修饰即为常量,不可变;被private修饰且没有set函数,不可被修改。

4、类和对象的区别

类是一个抽象的概念,类只是为所有的对象定义了抽象的属性与方法;对象是类的一个具体;

类是一个静态的概念,类本身不携带任何数据,当没有为类创建任何对象时,类本身不存在于内存空间中;对象是一个动态的概念,每一个对象都存在着属于自己的独特的属性和方法;

总结:类是对象的模板,对象是类的实例。

5、请列举你所知道的Object类的方法。

  1. clone():创建并返回此对象的一个副本;
  2. equals():检查其他某个对象是否与此对象“相等”;
  3. getClass():返回此Object的运行时类;
  4. hashCode():返回该对象的哈希码值;
  5. notify():随机唤醒一个等待线程;
  6. notifyAll():唤醒所有等待线程;
  7. toString():返回该对象的字符串表示;
  8. wait():在其他线程调用此对象的notify()方法或notifyAll()方法前,导致当前线程等待。

猜你喜欢

转载自www.cnblogs.com/liumilk/p/10637858.html