java面试题及解析—java基础

一、HashMap和HashSet的原理

二、HashMap是线程不安全的,请问哪个Map是线程安全的?ConcurrentHashMap是如何实现线程安全的?

参考ConcurrentHashMap是如何实现线程安全的

三、ArrayList和LinkedList的原理

四、异常类Exception和Error有什么区别

  • Exception和Error都继承自Throwable,在Java中只有Throwable类型的实例才可以被抛出或捕获。Error指正常情况下不太可能出现的情况,绝大部分的Error或导致程序崩溃,处于非正常的不可恢复的状态,如OutOfMemoryError、StackOverflowError。是程序中不应该试图捕获的严重问题。Exception是程序正常运行中可以预料的意外情况,可以捕获并处理

五、创建线程池的方式

  • 创建线程池四种方式:
  • newCachedThreadPool:创建一个可缓存的线程池,如果长度超过处理需要,则回收闲置的线程
  • newFixedThreadPool:创建一个定长的线程池,可控制线程最大并发量,超出线程在队列中等待
  • newScheduleThreaPool:创建一个定长的线程池,可周期或定时执行里面的线程
  • newSigleThreadPool:创建一个单例线程池,同时只能运行一个线程,保证线程的先进先出

六、创建线程池的核心参数

  • corePoolSize 核心线程数量 线程池常驻线程数量,超过的会放到队列中
  • maximumPoolSize 最大线程数量
  • keepAliveTime 线程的生存时间,超过生存时间将被销毁(仅针对任务队列中的线程)
  • timeUnit 时间单位,毫秒、秒
  • taskQueue 任务队列(阻塞队列),被提交但未被执行的任务
  • threadFactory 线程工厂,可以修改线程的名称
  • handler 拒绝策略
    • AbortPolicy:不执行任务并抛出异常(默认策略)
    • DisCardPolicy:不执行任务也不抛出异常
    • DisCardOldSetPolicy:将任务队列的第一个任务替换为新加入的任务
    • CallerRunsPolicy:直接调用execute方法执行任务
  • 参考线程池的特点、4种创建方式、7大核心参数

七、闲置的线程是如何回收的

八、线程的状态有哪些

  • 1、新建状态:用户创建线程,此时线程处于新建状态
  • 2、就绪状态:其他线程调用了该对象的start方法,进入就绪状态。该状态的线程位于“可运行的线程池”中,线程变得可运行只需获取CPU的使用权,即在就绪状态的线程除CPU外,其他资源均已获得
  • 3、运行状态:线程获取到CPU之后,进入运行状态
  • 4、阻塞状态:由于某些原因,使得线程放弃了CPU的使用权,由运行状态转换到阻塞状态,阻塞状态的线程要先变成就绪状态才能进入运行状态
  • 5、死亡状态:线程正常执行结束或因异常退出了run方法,进入死亡状态
  • 参考JVM中线程的状态转换图

九、讲一讲公平锁和非公平锁

十、讲一讲乐观锁和悲观锁

悲观锁和乐观锁

posted @ 2022-07-19 16:35  沐晨烟雨  阅读(44)  评论(0)    收藏  举报