java并发面试题(十一)

  1. 什么是线程调度器 (Thread Scheduler) ?
    答:线程调度器是一个操作系统服务, 它负责为Runnable状态的线程分配CPU时间, 一旦我们创建一个线程并启动它, 它的执行便依赖于线程调度器的实现。

  2. 什么是时间分片(Time Slicing )?
    答:时间分片是指将可用的CPU时间分配给可用的Runnable线程的过程。分配CPU时间可以基于线程优先级或者线程等待的时间。

  3. 什么时候抛出InvalidMonitorStateException异常?
    答:在线程调用wait ()/notify ()/notifyAll ()中的任何一个方法的时候,如果当前线程没有获得该对象的锁,那么就会抛出IllegalMonitorStateException的异常。

  4. 什么是FutureTask?
    答:在Java并发程序中 FutureTask 表示一个可以取消的异步运算。 它有启动和取消运算、查询运算是否完成和取回运算结果等方法。 只有当运算完成的时候结果才能取回,如果运算尚未完成get方法将会阻塞。一个 FutureTask对象可以对调用了Callable和Runnable的对象进行包装,由于FutureTask也是调用了Runnable接口所以它可以提交给Executor来执行。FutureTask适用于耗时的计算,主线程完全可以先完成自己的业务逻辑后,再去获取结果。

  5. 如何在Java中创建线程安全的单例(Singleton)?
    答:这里直接推荐使用枚举类型来创建,因为相比其他创建单例的方法,使用枚举类型还可以防止反射和序列化来破坏单例模式。具体可参考本篇博客【单例模式】。

  6. 什么是阻塞队列?
    答:java.util.concurrent.BlockingQueue的特性是:当队列是空的时, 从队列中获取或删除元素的操作将会被阻塞,或者当队列是满时, 往队列里添加元素的操作会被阻塞。阻塞队列不接受空值,当你尝试向队列中添加空值的时候,它会抛出NullPointerException。阻塞队列的实现都是线程安全的,所有的查询方法都是原子的并且使用了内部锁或者其他形式的并发控制。

  7. 在java中线程会因为哪些原因而放弃CPU?
    答:
    java虚拟机让当前线程暂时放弃CPU,转到就绪状态,这样其它线程就能获得运行机会。
    当前线程因为某些原因而进入了阻塞状态。
    线程结束运行,不管是异常退出还是正常结束。

  8. 怎么调整线程的优先级?
    答:
    让处于运行状态的线程调用Thread.sleep()方法。
    让处于运行状态的线程调用Thread.yield()方法。
    让处于运行状态的线程调用另一个线程的join()方法。

  9. 在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?
    答:监视器和锁在Java 虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行同步代码。

  10. 如何确保N个线程可以访问N个资源同时又不导致死锁?
    答:使用多线程的时候,一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序去获取锁,而当所有的线程都是以同样的顺序获取锁和释放锁,自然就不会出现死锁了。

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

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/104577046