Java多线程面试题合集

  • java死锁
  • 并发、并行、串行的区别
  • 线程安全的理解
  • 对守护线程的理解
  • 线程池的底层工作原理


java死锁

造成死锁的几个原因:

  1. 一个线程每次只能被一个线程使用.
  2. 一个线程在阻塞等待某个资源时,不释放一占有资源
  3. 一个线程已经获得资源,在未使用完之前,不能被强行剥夺
  4. 若干线程形成头尾相接的循环等待资源关系

    互斥使用,占有且等待,不可抢占,循环等待.
    这是造成死锁必须要达到的四个条件,如果要避免死锁,只需不满足其中的一个条件即可,而其中的前3个条件是作为锁要符合的条件,所以要避免死锁就要打破第4个条件,不出现循环等待锁的关系.

在开发过程中:

  1. 要注意枷锁的顺序
  2. 要注意加锁的时限,可以针对锁设置一个超时时间
  3. 要注意死锁的检查这是一种预防机制,确保第一时间发现死锁并进行解决

并发、并行、串行的区别

  1. 串行:一个任务执行完,才能执行下一个任务。
  2. 并行(Parallelism):两个任务同时执行。
  3. 并发(Concurrency):两个任务整体看上去是同时执行,在底层两个任务被拆成了很多份,然后一个一个执行,站在更高的角度看来两个任务之哦通知在执行的。

线程安全的理解

线程安全的含义,我们写一段代码,在多个线程同时执行该代码,不会产生混乱,还能得到正常的结果,比如i++,i初始化值为0,那么两个线程同时执行这行代码,如果代码是线程安全的,所以最终的结果应该是一个线程的结果是1,一个线程的结果为2,如果有两个线程的结果为1,表示,这是线程不安全的代码。

所以线程安全,主要是指代码在多个线程同时执行的情况下,能得到正确的结果。

对守护线程的理解

线程分为用户线程和守护线程,用户线程就是普通线程,守护线程就是jvm的后台线程,比如垃圾回收线程就是一个守护线程,守护线程会在其他普通线程都停止运行之后自动关闭.我们可以通过设置thread.setDaemon(true)来把线程设置为守护线程.

线程池的底层工作原理

线程池内部是通过队列+线程实现的,当我们利用线程执行任务时:

  1. 如果此时线程池中的线程数量小于corePollSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务.
  2. 如果此时线程池中的线程数量等于corePollSize,但是缓冲队列workQueue未满,那么任务被放入缓冲队列中.
  3. 如果此时线程池中的线程数量大于等于corePollSize,缓冲线程workQueue满,并且线程池中的数量小于maximumPollSize,建新的线程来出路被添加的任务.
  4. 如果此时线程池中的线程数量大于corePollSize,缓冲线程workQueue满,并且线程池中的数量等于maximumPollSize,那么通过handle所指定的策略来处理此任务.
  5. 如果此时线程池中的线程数量大于corePollSize时,如果线程空闲时间超过keepAliveTime,线程将被终止.这样,线程池可以动态的调整线程池中的线程数