面面面(2)

1、介绍下Java泛型

泛型是jdk5以后推出的特性,主要目的是编译时的类型检查,避免运行时类型转换异常,实现代码复用及为了适配更多代码及之前版本。举例在不用泛型时候,用ArrayList存字符串,需要手动强转。如果存了其他类型,运行时才会报错。(这样好处是,比如对于arrayList里面插入不同类型时能尽早识别。)本质是类型参数化。

主要有三个用处:泛型类,比如一般封装好的Result类或者常见的容器类;泛型方法,在方法返回值前面用泛型;泛型通配符。

? extends T上界通配符,可以接收T及其子类,但是不能写,只能读。(因为编辑时,不清楚具体子类型)

? super T 下届通配符,可以接收T及其父类,但是只能写不能读。读只能是object类型。

泛型原理:类型擦除。是在编译时期,把泛型参数替换成边界类型或者是Object类型,同时插入类型转换代码。

2、spingboot启动流程

1、new springBootApplication 先判断是什么类型web还是应用,设置初始化器,监听器,主类。记得推断启动类型是判断类路径中是否有jarakta.servelet.Servelet相关的类就是web 应用,设置初始化器触发springboot自动配置动作,就是从spring.factories加载并初始化类。

2、启动.run方法。1、准备环境,加载配置环境,系统变量,命令行参数,最终封装成configureableEnvironment 2、创建ApplicationContext ,装配Bean,加载配置类,@ComponentScan就是这里发挥作用。3、刷新上下文,所有bean初始化完成,事务监听器配置完毕。web项目这时候会启动内置的tomcat。4、调用commandLineRunner ApplicationRunner 可以启动后输出内容 5、发布ApplicationReadyEvent,所有启动流程结束,应用进入运行状态,准备接收请求

3、@Resource和@Autowired 的区别

一个通过name一个通过类型

4、创建线程的几种方式

4种。1、直接继承Thread,但是java是单继承,不太方便。2、实现Runable接口 ,但是没有返回值 3、实现callable接口,但是得有futureTask 4、还有说用线程池。那就区别于前面new Thread,而是用executorService.execute(new xxThread())方法。

5、在工作中是怎么运用线程的呢?

是用线程池的方式使用线程。如何创建的呢?不能说用executor,因为它的工作队列是无界队列,容易OOM。

6、threadLocal

是每个线程的数据副本,底层是一个threadLocalMap,里面的key是弱引用,存得是该threadLocal对象,value是值,如果在不用完之后remove容易出现内存泄漏问题。

为什么是弱引用,因为这样,remove掉key value之间连接,gc时候就能吧该键值对给回收掉。

假设 Key 是强引用:如果 ThreadLocal 对象(比如局部变量)已经不用了,但 Thread 还在运行(比如线程池的核心线程),那么 ThreadLocalMap 的 Key 会一直强引用 ThreadLocal 对象,导致 ThreadLocal 无法被 GC 回收,进而引发内存泄漏;

用弱引用:当 ThreadLocal 对象没有其他强引用时,GC 会直接回收这个 Key(弱引用对象只要 GC 就会被回收),此时 Map 中会出现'Key 为 null'的无效键值对。⚠️ 注意:弱引用只能解决 Key 的回收问题,Value 依然是强引用 ------ 如果不手动 remove,Value 会一直被 Thread 的 Map 引用,直到 Thread 结束,这才是 ThreadLocal 内存泄漏的核心原因。

7、sychnorized锁升级过程

相关推荐
Moshow郑锴2 小时前
sql-pipeline - 基于PostgreSQL的SQL健康检查与发布编排平台
java·sql
weixin_307779135 小时前
C++代码实现MATLAB中的dlarray函数功能
开发语言·c++·算法·matlab
一水鉴天8 小时前
映射、哈希表与哈斯图:计算机科学的三种基线 20261003(元宝)
开发语言·人工智能
Frank_refuel8 小时前
C++11之一场名为“搬家”的 C++ 之旅
开发语言·c++
Wang's Blog9 小时前
Java 项目实战: 外卖平台优化-Nginx配置文件结构与块层级
java·开发语言·nginx
2601_962071579 小时前
类变量和全局变量的查找路径有什么区别?
开发语言·python
\光辉岁月/10 小时前
5.java-数组
java·开发语言
Java后端的Ai之路10 小时前
Python进阶探索29_eval内置函数
开发语言·python·探索·eval·内置函数
谢亮_vipxieliang11 小时前
Spring 事务失效的常见场景
java·开发语言·数据库·spring boot
时间的拾荒人11 小时前
Qt 多线程详解:从 QThread 到实战
开发语言·qt·面试