2021 Java面试题四(持续更新)

题目

  1. ThreadLocal的原理和使用场景
  2. ThreadLocal内存泄漏的原因,如何避免
  3. 什么是强引用,什么是弱引用
  4. 为什么用线程池?解释下线程参数?
  5. 线程池处理流程
  6. 线程池中阻塞队列的作用
  7. 为什么先添加队列而不是创建最大线程
  8. 线程池中线程复用原理
  9. spring是什么

个人理解

  1. ThreadLocal的原理和使用场景
    Theadlocal是Thread的局部变量,本质是局部的静态Map,key是当前的句柄,value是线程变量,使用场景有1.在进行对象跨层传递的时候,可以避免多次传递,打破层次间的约束。 2.线程间数据隔离。 3.进行事务操作,用于存储线程事务信息。4.数据库连接,session会话管理。

  2. ThreadLocal内存泄漏的原因,如何避免
    内存泄露是指不会再被使用的对象或变量占用的内存不能被回收。ThreadLocal中内存泄漏的原因是ThreadLocalMap中不存在外部强引用的时候,key会被回收,key就成了null,而value却还存在,由于ThreadLocalMap的生命周期和Thread一样长,没有手动删除key则会导致内存泄漏。

  3. 什么是强引用,什么是弱引用
    强引用:使用new关键字创建的对象一般都是强引用,不会被垃圾回收器回收,当内存不足时,JVM会抛出Error使程序停止。若想取消引用与对象之间的关系,可以显式地将引用赋值为null。
    弱引用:使用java.lang.ref.weakreference类来表示,JVM在进行垃圾回收的时候,无论内存是否充足,都会回收。

  4. 为什么用线程池?解释下线程参数?
    1.降低资源消耗。2.提高相应速度。3.提高线程的可管理性
    线程参数:1.corePoolSize(核心线程数)2.maxinumPoolSize(最大线程数)3.keepAliveTime,unit(超出超出核心线程数之外的线程的空闲存活时间)4.workQueue(用于存放待执行的任务)5.ThreadFactory(线程工厂,用来生产线程执行任务) 6.Handler(任务拒绝策略)

  5. 线程池处理流程
    在这里插入图片描述

  6. 线程池中阻塞队列的作用
    一般的队列只能保证作为一个有限长度的缓冲区,如果超出了缓冲长度,就无法保证当前的任务。阻塞队列可以保证任务队列中没有任务时,阻塞获取任务的线程,使得线程进入wait状态,释放cpu资源,阻塞队列还自带阻塞和唤醒的功能。

  7. 为什么先添加队列而不是创建最大线程
    在创建新线程时,需要获取全局锁,这时候其他的线程就会阻塞,影响了整体的效率。

  8. 线程池中线程复用原理
    在线程池中,同一个线程可以从阻塞队列中不断获取新任务来执行,核心原理在于每一个线程会执行一个循环任务,不断检查是否有任务需要被执行,如果有就掉用run方法执行。

  9. spring是什么
    spring是轻量级的开源的J2EE框架,是一个容器框架,用来封装JavaBean(Java对象),中间持久层起一个连接操作(整合框架,Mybatis等等)。
    spring也是轻量级的IOC(控制反转)和AOP(面向切面)容器框架。

最后

明天还会更新的!
如果有理解不对的地方,欢迎指出。
谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值