java并发面试题(五)

  1. 什么是多线程环境下的伪共享(false sharing)?
    答:在多核的CPU架构中,每个处理器都有自己的局部缓存,缓存系统是以缓存行为单位存储的,当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,就会无意中影响彼此的性能,这就是伪共享。

  2. 同步和异步有何异同?
    答:同步就是事情必须一件一件的做,下一件事的开始必须在上一件事结束后。异步就是下一件事的开始无需等待上一件事的结束,两件事之间没有强关联。

  3. 调用start()方法时会执行run()方法,为什么不能直接调用run()方法?
    答:调用start()方法时,JVM底层会帮我们生产新的线程,然后再通过这个线程来调用run()方法里的逻辑,而直接调用run()方法则不同,不会产生新线程,就是简简单单把run()方法当成普通方法运行。

  4. stop()方法和 suspend()方法为何不推荐使用?
    答: 首先两者都做到停止线程的效果,其中stop() 方法的停止很暴力,不安全,容易造成数据的不一致。而 suspend() 方法的停止很无赖,它不会释放锁,这就容易造成死锁了。

  5. 如何让正在运行的线程暂停一段时间?
    答:使用sleep()方法或wait()方法。

  6. 线程状态,BLOCKD和WAITING有什么区别?
    答:当线程无法进入同步方法或者同步代码块中时,线程状态就是BLOCKD,这个线程这时处于同步队列。当线程调用了wait,join等方法就会进入WAITING状态,这时线程处于等待队列。当处于等待队列的线程通过notify(),notifyAll()等方法被唤醒时,就会进入同步队列。

  7. 提交任务时,线程池队列已满时会发会生什么?
    答:可参考本篇博客【简单了解线程池】中的线程池工作流程图。

  8. 线程池中submit() 和 execute()方法有什么区别?
    答:两者都可以用于向线程池提交任务。不过submit()方法的返回值是Future类型,而execute()方法无返回值。submit()方法方便Exception处理。

  9. 说说什么是CountDownLatch?
    答:可参考本篇博客【CountDownLatch的简单应用和实现原理 】。

  10. 说说什么是CyclicBarrier?
    答:可参考本篇博客【CyclicBarrier的简单使用】。

发布了213 篇原创文章 · 获赞 214 · 访问量 3万+

猜你喜欢

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