1、wait方法底层原理
wait是object中的方法,可以暂停线程,会释放对象锁,不像sleep方法,线程休眠期依然持有锁,通过调用notify或notifyAll方法唤醒线程。
lock.wait()方法最终通过ObjectMonitor的wait()方法实现:
- 将当前线程封装成ObjectWaiter对象node;
- 通过ObjectMonitor
的AddWaiter
方法将node添加到WaitSet列表中; - 通过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类的方法。
- clone():创建并返回此对象的一个副本;
- equals():检查其他某个对象是否与此对象“相等”;
- getClass():返回此Object的运行时类;
- hashCode():返回该对象的哈希码值;
- notify():随机唤醒一个等待线程;
- notifyAll():唤醒所有等待线程;
- toString():返回该对象的字符串表示;
- wait():在其他线程调用此对象的notify()方法或notifyAll()方法前,导致当前线程等待。