新年第一期面试题,2020年面试题不能拉

码个蛋(codeegg) 第 851 次推文

开奖啦!福利时间

元旦福利抽奖开奖啦!在留言区参加活动的朋友中,恭喜过客玉米3位朋友获得。请联系码仔领奖。加微信:lx409070956,备注 中奖

新年第一期面试题,2020年面试题不能拉_第1张图片

新年第一期面试题,2020年面试题不能拉_第2张图片

1. 谈谈wait/notify关键字的理解

概念:锁池和等待池:一、锁池:假设线程A已经拥有了某个对象(注意:不是类)的锁,而其它的线程想要调用这个对象的某个synchronized方法(或者synchronized块),由于这些线程在进入对象的synchronized方法之前必须先获得该对象的锁的拥有权,但是该对象的锁目前正被线程A拥有,所以这些线程就进入了该对象的锁池中。二、等待池:假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁后,进入到了该对象的等待池中。

notify和notifyAll的区别:

、如果线程调用了对象的 wait()方法,那么线程便会处于该对象的等待池中,等待池中的线程不会去竞争该对象的锁。

、当有线程调用了对象的notifyAll()方法(唤醒所有 wait 线程)或 notify()方法(只随机唤醒一个 wait 线程),被唤醒的的线程便会进入该对象的锁池中,锁池中的线程会去竞争该对象锁。也就是说,调用了notify后只要一个线程会由等待池进入锁池,而notifyAll会将该对象等待池内的所有线程移动到锁池中,等待锁竞争。

、优先级高的线程竞争到对象锁的概率大,假若某线程没有竞争到该对象锁,它还会留在锁池中,唯有线程再次调用 wait()方法,它才会重新回到等待池中。而竞争到对象锁的线程则继续往下执行,直到执行完了synchronized 代码块,它会释放掉该对象锁,这时锁池中的线程会继续竞争该对象锁。

2. 假如try{}里有一个return语句?

问:try{}里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行,什么时候被执行,在return前还是后?

答:会执行,在方法返回前执行。在finally中改变返回值的做法是不好的,因为如果存在finally代码块,try中的return语句不会立马返回调用者,而是记录下返回值待finally代码块执行完毕之后再向调用者返回其值,然后如果在finally中修改了返回值,就会返回修改后的值。

3. 有n多个布尔值,如何判断?

问:有五个布尔值,当全为true时或全为false时为true,其他为false,如何判断?当有n个时呢?

方法一:

/**
* @return true:全为true或全为false,
* false:有一个不同时。
*/
 public static boolean checkSameBoolean(List list) {
     int m = 0;
     for (int i = 0; i < list.size(); i++) {
       Boolean aBoolean = list.get(i);
       if (aBoolean) {
        m++;
         } else {
         m--;
       }
     }
   return Math.abs(m) == list.size();
 }

方法二:

fun checkSameBoolean(values: MutableList): Boolean {
  require(values.isNotEmpty()) { "List can't be empty" }

  val first = values[0]

  values.filterNot { it == first }.forEach { _ -> return false }

  return true
}

4. 为什么wait(), notify()和notifyAll ()

必须在同步方法或者同步块中被调用?

当一个线程需要调用对象的wait()方法的时候,这个线程必须拥有该对象的锁,接着它就会释放这个对象锁并进入等待状态直到其他线程调用这个对象上的notify()方法。同样的,当一个线程需要调用对象的notify()方法时,它会释放这个对象的锁,以便其他在等待的线程就可以得到这个对象锁。由于所有的这些方法都需要线程持有对象的锁,这样就只能通过同步来实现,所以他们只能在同步方法或者同步块中被调用。

5. 多线程和单线程的区别和联系?

在单核 CPU 中,将 CPU 分为很小的时间片,在每一时刻只能有一个线程在执行,是一种微观上轮流占用 CPU 的机制。

多线程会存在线程上下文切换,会导致程序执行速度变慢,即采用一个拥有两个线程的进程执行所需要的时间比一个线程的进程执行两次所需要的时间要多一些。

结论:即采用多线程不会提高程序的执行速度,反而会降低速度,但是对于用户来说,可以减少用户的响应时间

往期文章:

  •   《每日一道面试题》第一期

  • 《每日一道面试题》 第二期

  • 《每日一道面试题》 第三期

  • 《每日一道面试题》第四期

  •   《每日一道面试题》第五期

  • 《每日一道面试题》 第六期

  • 《每日一道面试题》 第七期

  • 《每日一道面试题》 第八期

  • 《每日一道面试题》 第九期

  • 《每日一道面试题》 第十期

  • 《每日一道面试题》 第十一期

  • 《每日一道面试题》 第十二期

  • 《每日一道面试题》 第十三期

  • 《每日一道面试题》 第十四期

  • 《每日一道面试题》 第十五期

  • 《每日一道面试题》第十六期

  • 《每日一道面试题》第十七期

  • 《每日一道面试题》第十八期

  • 《每日一道面试题》第十九期

  • 《每日一道面试题》第二十期

  • 《每日一道面试题》第二十一期

  • 《每日一道面试题》第二十二期

  • 《每日一道面试题》第二十三期

  • 《每日一道面试题》第二十四期

今日问题:

是不是好久没看面试题了?

专属升级社区:《这件事情,我终于想明白了》 

你可能感兴趣的:(新年第一期面试题,2020年面试题不能拉)