2021年精选Java面试题,附答案

112 阅读2分钟
  1. 为什么wait, notify 和 notifyAll这些方法不在thread类里面? 一个很明显的原因是JAVA提供的锁是对象级的而不是线程级的,每个对象都有锁,通过线程获得。由于wait,notify和notifyAll都是锁级别的操作,所以把他们定义在Object类中因为锁属于对象。

  2. synchronized包括哪两个jvm重要的指令? monitor enter 和 monitor exit

  3. 为什么wait和notify方法要在同步块中调用? Java API强制要求这样做,如果你不这么做,你的代码会抛出IllegalMonitorStateException异常。还有一个原因是为了避免wait和notify之间产生竞态条件。

  4. 现在有 T1、T2、T3 三个线程,你怎样保证 T2 在 T1 执行完后执行,T3 在 T2 执行完后执 行? 这个线程问题通常会在第一轮或电话面试阶段被问到,目的是检测你对”join”方法是否熟 悉。这个多线程问题比较简单,可以用 join 方法实现。java培训

public class JoinTestSync { public static void main(String[] args) throws InterruptedException { // TODO Auto-generated method stub ThreadJoinTest1 t1 = new ThreadJoinTest1("今天"); ThreadJoinTest1 t2 = new ThreadJoinTest1("明天"); ThreadJoinTest1 t3 = new ThreadJoinTest1("后天"); /* * 通过join方法来确保t1、t2、t3的执行顺序 * */ t1.start(); t1.join();
t2.start(); t2.join(); t3.start(); t3.join(); }

}

class ThreadJoinTest1 extends Thread{ public ThreadJoinTest1(String name){ super(name); } @Override public void run(){ for(int i=0;i<5;i++){ System.out.println(this.getName() + ":" + i); } } }

  1. 什么是Daemon线程?它有什么意义? 所谓后台(daemon)线程,是指在程序运行的时候在后台提供一种通用服务的线程,并且这个线程并不属于程序中不可或缺的部分。因此,当所有的非后台线程结束时,程序也就终止了,同时会杀死进程中的所有后台线程。

反过来说, 只要有任何非后台线程还在运行,程序就不会终止。必须在线程启动之前调用setDaemon()方法,才能把它设置为后台线程。**注意:**后台进程在不执行finally子句的情况下就会终止其run()方法。

比如:JVM的垃圾回收线程就是Daemon线程,Finalizer也是守护线程。