java并发面试题(八)

  1. 说说isInterrupted()方法和interrupted()方法?
    答:可参考本篇博客【isInterrupted()方法和interrupted()方法简析】。

  2. 你是如何调用wait()方法的?使用if块还是循环?为什么?
    答:wait()方法应该在循环调用,因为当线程获取到CPU开始执行的时候,其他条件可能还没有满足,所以在处理前,循环检测条件是否满足会更好。

  3. 在线程中你怎么处理不可捕捉异常?
    答:使用Thread.UncaughtExceptionHandler,它是java SE5中新加的接口,它允许我们在每一个Thread对象上添加一个异常处理器。

  4. 什么时候应该使用可重入锁?
    答:递归调用或者线程调用同一对象其它用synchronized修饰的方法。

  5. 如何确保main()方法所在的线程是Java程序最后结束的线程?
    答:join()方法或者CountDownLatch类。

  6. 什么是Java Timer类?
    答:java.util.Timer是一个工具类,可以用于安排一个线程在未来的某个特定时间执行。Timer类可以用安排一次性任务或者周期任务。

  7. 如何创建一个有特定时间间隔的任务?
    答:使用java.util.TimerTask类,它是一个实现了Runnable接口的抽象类,我们需要去继承这个类来创建业务需要的定时任务并使用Timer去安排它的执行。

  8. 什么是死锁(Deadlock)?
    答:两个或两个以上的线程互相等待对方的资源,而这些线程又需要得到对方的资源后,才能释放自己的资源,造成了这些线程永远阻塞的现象,就是死锁。

  9. 如何分析和避免死锁?
    答:先通过jstack拿到应用程序死锁的线程转储文件,然后要注意那些被阻塞的线程,以及等待锁定的资源,因为每个资源都有一个惟一的ID,所以以此为依据可以找到哪些线程已经持有了对象上的锁 。

  10. 同步方法和同步块,哪个是更好的选择?
    答:要是用同步方法,那么锁住的就是一整个对象了,对象的其他同步方法都需要互相等待。而使用同步块,锁的范围可以更小,而且可以只针对锁住某个我们定义的对象,灵活性也更高。

发布了217 篇原创文章 · 获赞 215 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/104552136
今日推荐