面试
王佑辉
个人笔记,多谢指正,不喜勿喷
展开
-
【面试】虚拟机栈面试题
1. 如果只有一个线程才可以操作此数据,则是线程安全的2. 如果有多个线程操作此数据,则此数据是共享数据。不考虑同步机制的话,会存在线程安全问题。3. 在方法里定义的变量,且变量的生命周期仅限于该方法,则该变量是线程安全的4. 如果变量是作为参数传到方法里的,或者方法中定义的变量作为返回值,给到其它方法调用,这两种情况是线程不安全的。原创 2023-11-04 16:32:08 · 250 阅读 · 0 评论 -
【面试】pc寄存器题
4.由于cpu时间片轮限制,多线程在并发执行过程中,任何一个确定的时刻,一个处理器或多核处理器中的一个内核只会执行某个线程中的一条指令,导致经常中断和恢复,每个线程在创建后,都会产生各自的程序计数器和栈帧,程序计数器在各个线程之间互不影响。1.多线程是在特定的时间段内只会执行其中某一个线程的方法,cpu会不停地切换任务,导致任务经常中断和恢复。2.为了能准确地记录各个线程正在执行的当前字节码指令地址,所以为每一个线程分配一个pc寄存器。3.各个线程之间可以进行独立的计算,不会相互干扰。原创 2023-10-09 21:27:54 · 158 阅读 · 0 评论 -
【spring】spring依赖注入的方式
2.控制了对象的外部可见性,不被spring容器托管的对象无法自动注入。3.每个set方法单独注入一个对象,可以灵活控制,可以实现选择性注入。2.注入对象很多的情况下,构造器参数列表会很长,不灵活。1.如@Autowired、@Resource注解。3.对象初始化完成后,即可获得可使用的对象。2.可以确保注入前不依赖spring容器。4.被final修饰的属性,无法赋值。3.不能被检测出是否出现循环依赖。2.通过Setter方法注入。3.通过Field属性注入。1.日常开发中不常见。原创 2023-04-21 22:08:41 · 501 阅读 · 0 评论 -
【多线程】线程通信
17.Conditon中的await()对应Object的wait(),Condition中的signal()对应Object的notify(),Condition中的signalAll()对应Object的notifyAll()。13.await()、signal()、signalAll()是Condition接口中的方法,该接口是在Java 1.5中出现的,它用来替代传统的wait+notify实现线程间的协作,它的使用依赖于 Lock。8.这三个方法都是本地方法,并且被final修饰,无法被重写。原创 2023-03-29 21:45:00 · 370 阅读 · 0 评论 -
【多线程】synchronized和lock的区别
6.synchronized锁可重入、不可中断、不是公平锁;Lock锁可重入、可中断、可公平/不公平,并可以细分读写锁以提高效率。3.synchronized在代码执行完或出现异常时自动释放锁;Lock不会自动释放锁,需要在finally中显示释放锁。1.synchronized是Java关键字,在JVM层面实现加锁和解锁;Lock是一个接口,在代码层面实现加锁和解锁。5.synchronized无法得知是否获取锁成功;2.synchronized可以用在代码块上、方法上;Lock只能写在代码里。原创 2023-03-28 09:49:25 · 99 阅读 · 0 评论 -
【spring】@Transactional注解属性说明
1.该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚,与rollbackForClassName相反。1.该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚,与rollbackFor相反。1.该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。1. 该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。2.事务隔离级别介绍。原创 2023-03-27 22:45:21 · 808 阅读 · 1 评论 -
【mysql】使用索引注意事项
5.索引中不会包含有null的值,组合索引如果某一列含有null值,这列对组合索引是无效的,索引列尽量不要让字段的默认值为null。4.如果select中某个字段不在索引中,可以将该列加入到组合索引中,避免二次回表查询。7.like 'value%'可以使用到索引,但like '%value%'会全表扫描。6.查询条件左右两侧类型不匹配会发生隐式转换,可能会导致索引失效。1.不在列上使用函数或运算,会导致索引失效而进行全表扫描。=、in等没有顺序的操作符,会导致索引失效。原创 2023-03-26 21:33:51 · 43 阅读 · 0 评论 -
【mysql】数据库三范式
3.第三范式:先满足第二范式(2NF),要求:表中的每一列只与主键直接相关而不是间接相关,(表中的每一列只能依赖于主键)。例如存在一个部门信息表,其中每个部门有部门编号、部门名称、部门简介等信息,员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。2.第二范式:满足第一范式后,要求表中的所有列,都必须依赖于主键,而不能有任何一列与主键没有关系,也就是说一个表只描述一件事情。原创 2023-03-26 21:08:32 · 48 阅读 · 0 评论 -
【mysql】性能优化
3.show profiles工具使用,查看sql语句当前会话中sql资源消耗情况,io开销、cpu开销、内存开销等。2.读写分离设计,读多写少的场景中通过读写分离的方案,可以避免读写冲突导致的性能问题。4.热点数据可以引入更为高效的缓存数据库,例如redis、mongoDB等。2.sql执行计划分析,使用关键字explain查看当前sql的执行计划。1.修改my.cnf中默认配置,例如修改最大连接数。3.提高硬盘的读写速度,使用专用的固态硬盘。1.慢sql的定位与排查,慢查询日志分析。原创 2023-03-26 20:56:36 · 594 阅读 · 0 评论 -
【mysql】索引设计原则
在修改索引列的内容时,索引会进行更新甚至重构,索引列越多,更新重构时间越长。只保持需要的索引有利于查询即可,不需要建立多余列的索引。9.尽量扩展索引,不新建索引,例如a字段有索引,加a,b字段的索引时,可以修改原来a字段的索引为联合索引。4.使用短索引,对长字符串列进行索引,可以指定一个前缀长度,可以节省大量索引空间。8.不能有效区分数据的列不创建索引,例如性别,区分度太低,加了索引也没有多大作用。2.适合索引的列是在where子句中的列,或者连接子句中指定的列。7.更新频繁的字段不适合创建索引。原创 2023-03-26 20:40:40 · 288 阅读 · 0 评论 -
【mysql】mysql的各种索引
前缀索引可以建立的类型为char、varchar、binary、varbinary的列上,减少索引占用的存储空间,能提升索引查询效率,mysql无法使用前缀索引做order by和group by。如果存在主键,主键索引就是聚集索引,不存在主键,使用第一个唯一索引作为聚集索引,没有合适的唯一索引,innodb会生成一个rowid作为隐藏的聚集索引。1.主键索引:建立在主键上的索引,一张表只能有一个主键索引,索引列值不能为空,通常在创建表是一起创建。原创 2023-03-26 20:16:19 · 198 阅读 · 0 评论 -
【redis】redis缓存击穿
1.一个被高并发访问且缓存重建业务比较复杂的key过期了,会造成大量的请求访问数据库2.key失效,线程A获取key缓存未命中,去查数据库,拿到数据,构建缓存,构建时间长,还没来得及将数据写入到缓存中,线程B获取key缓存也未命中,去查数据库,拿到数据,构建缓存,构建时间长,缓存还未写入。大量的并发都会去查数据库,给数据库造成压力。原创 2023-03-25 15:55:36 · 279 阅读 · 0 评论 -
【redis】redis缓存雪崩
1.同一时间大量的key同时失效或者redis宕机,大量请求直接访问数据库。原创 2023-03-25 15:07:02 · 138 阅读 · 0 评论 -
【redis】redis缓存穿透
1.客户端请求的数据在数据库中没有,这样缓存永远不会生效,所有客户端请求都会访问数据库。原创 2023-03-25 14:44:16 · 463 阅读 · 0 评论 -
【redis】redis淘汰策略
4.volatile-lfu:会使用lfu算法筛选设置了过期时间的键值对删除(Least Frequently Used的缩写,即最不经常使用)3.volatile-lru:会使用lru算法筛选设置了过期时间的键值对删除(Least Recently Used的缩写,即最近最少使用)1.volatile-ttl:在筛选时,会针对设置了过期时间的键对值,根据过期时间的先后进行删除,越早过期的越先被删除。3.主动清理策略在redis4.0之前一共实现了6种内存淘汰策略,在4.0之后,增加了2种,总共8种。原创 2023-03-25 08:42:30 · 764 阅读 · 0 评论 -
【redis】key过期了为什么不释放内存
3.定时删除:由于惰性删除策略无法保证冷数据被及时删掉,redis会定期(默认每100ms)主动淘汰一批已过期的key,所以可能会出现部分key已经过期但还没有被清理的情况,导致内存没有释放。2.惰性删除:当读\写一个已经过期的key时,会触发惰性删除策略,判断key是否过期,如果过期了直接删除这个key。1.redis对过期的key的处理一般有惰性删除和定时删除两种策略。原创 2023-03-25 08:21:50 · 135 阅读 · 0 评论 -
【redis】redis单线程为什么能这么快
4.高效的存储结构:全局hash表、跳表、压缩列表、链表等。1.redis执行的命令是单线程执行的,没有线程切换开销。3.基于IO多路复用机制提升了redis的i/o利用率。2.redis命令执行是基于内存的。原创 2023-03-25 08:10:07 · 44 阅读 · 0 评论 -
【spring】spring事务的隔离级别
1.脏读2.不可重复读3. 幻读4.是并发事务产生的问题。原创 2023-03-21 21:28:18 · 972 阅读 · 1 评论 -
【spring】spring事务的传播行为
Transactional(propagation=Propagation.REQUIRES_NEW)适用内部事务和外部事务不存在业务关联的情况,例如日志。@Transactional(propagation=Propagation.MANDATORY)不常用。@Transactional(propagation=Propagation.NEVER)不常用。1.事务的传播特性是当一个事务方法被另一个事务方法调用时,这个事务方法该如何进行。required(默认)不用外部事务,开启新事务。原创 2023-03-19 22:57:13 · 121 阅读 · 0 评论 -
【spring】spring的aop是在哪里创建的动态代理
2.循环依赖的Bean在bean属性注入时存在的循环依赖的情况下,会为循环依赖的Bean通过MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition创建aop。1.正常的Bean会在bean的生命周期的初始化后,通过BeanPostProcessor.postProcessAfterInitailization创建aop的动态代理。原创 2023-03-19 22:01:07 · 117 阅读 · 0 评论 -
【spring】jdk动态代理和cglib动态代理的区别
6.性能上:在老版的jdk,jdk代理生成的类速度快,通过反射调用慢,cglib是jdk代理速度的10倍左右,jdk在版本每次升级都会有很大的性能提升,cglib停滞不前,jdk7 8的动态代理性能在1万次实验中比cglib要快20%左右。5.jdk动态代理如果目标类未实现接口则无法代理,cglib是通过继承的方式来动态代理,若目标类被final关键字修饰,则无法使用cglib做动态代理。1.jdk动态代理只提供实现接口的目标类代理,不支持没有实现接口的目标类的代理。3.从限制角度讨论区别。原创 2023-03-19 20:07:58 · 3361 阅读 · 2 评论 -
【spring】spring通知有哪些类型
7.spring5.2.7之前的执行顺序:前置->方法->后置->返回,前置->方法->后置->异常,spring5.2.7之后的执行顺序:前置->方法->返回->后置,前置->方法->异常->后置。6.环绕通知(around):通知包裹被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。3. 后置通知(after):在目标方法完成之后调用通知,不关心方法的输出是什么。2.前置通知(before):在目标方法被调用之前调用通知功能。1.spring切面有5种类型的通知。原创 2023-03-19 16:39:39 · 245 阅读 · 0 评论 -
【spring】aop的名词
3. 通知(advice):需要增加到业务方法中的公共代码,通知有很多类型分别可以在需要增加的业务方法不同位置进行执行(前置通知、后置通知、异常通知、返回通知、环绕通知)4.切点(pointcut):决定哪些方法需要增强、哪些不需要增强,结合切点表达式进行实现。6.织入(weaving):aop用的织入方式是动态代理,为目标对象创建动态代理的过程。5.目标对象(target object):增强的对象。2.连接点(join point):被增强的业务方法。1.切面(aspect):切面类,管理切点和通知。原创 2023-03-19 16:13:22 · 64 阅读 · 0 评论 -
【spring】aop是什么
2.用于将与业务无关,对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,该模块被命名为切面Aspect。1.全称是Aspect Oriented Programming,称为切面编程。3. 减少系统中的重复代码,降低了模块间的耦合度,提高了系统的可维护性。4.可用于权限认证、日志记录、事务处理等。原创 2023-03-19 15:53:22 · 32 阅读 · 0 评论 -
【spring】将一个第三方的类配成为Bean有哪些方式
4.beanDefinition注册后置处理器(BeanDefinitionRegistryPostProcessor),不需要@Import引入,但顺序在后面。3. @Import导入ImportBeanDefinitionRegistrar实现类,可以给BeanDefinition设置属性等信息。1.第三方的bean不能改写源码,在类上加@Component注解。2.@Import导入类,实例化过程不能干预。1.@Bean方式,实例化过程可以更改。原创 2023-03-19 15:21:23 · 605 阅读 · 0 评论 -
【spring】@Autowired和@Resource的区别
2.@Autowired是spring提供的注解,@Resource是jdk提供的注解。4.@Resource会按名称来进行匹配,如果匹配到多个会按照类型来匹配。3.@Autowired会按类型进行匹配,如果匹配到多个按照名称来匹配。1.都可以设置一个属性进行自动注入。原创 2023-03-18 21:41:24 · 38 阅读 · 0 评论 -
【spring】如何让自动注入找到多个依赖Bean时不报错
1.加@Primary注解。原创 2023-03-18 20:48:17 · 115 阅读 · 0 评论 -
【spring】如何让自动注入没有找到依赖Bean时不报错
1.@Autowired(required = false)原创 2023-03-18 18:39:19 · 444 阅读 · 0 评论 -
【spring】@import的用法
5.通过实现了DeferredImportSelector(ImportSelector的子类)可以一次性注册多个,返回一个string[]每一个值是完整类路径,与ImpoertSelector的区别:顺序靠后,SpringBoot用的一种方式。3. 指定实现了ImportSelector接口的类,通过ImportSelector可以一次性注册多个,返回一个string[]数组中,数组中每一个值是类的完整路径。原创 2023-03-18 18:37:20 · 104 阅读 · 0 评论 -
【spring】@Component、@Controller、@Service和@Repository有什么区别
2.@Controller、@Service、@Repository的源注解就是@Controller。5.@Repository用于数据访问层。3. @Controller用于控制层。4.@Service用于业务逻辑层。1.四个注解的作用是一样的。原创 2023-03-18 16:48:49 · 72 阅读 · 0 评论 -
【spring】javaConfig是如何替代spring.xml的
3.bean配置: <bean class=“com.learning.UserService” scope=“singleton” lazy-init=“false”></bean>6.注入基本属性:<property name=“password” value=“${mysql.password}”></property>3. bean配置:@Bean、@Scope(“singleton”)、@Lazy(false)6.注入基本属性:@Value(“${mysql.password}”)原创 2023-03-18 14:30:16 · 388 阅读 · 0 评论 -
【spring】spring有哪几种配置方式
1.文件名为spring-annotation.xml,文件位置放入resources中。1.这里是@Configuration注解,@Bean @Import等暂不介绍。3. 基于java的配置,javaConfig,spring3.0+开始。1.文件名为spring.xml,文件位置放入resources中。1.基于xml配置文件,spring诞生的一种配置方式。1.spring有三种重要的方法提供配置元数据。2.基于注解的配置,spring2.5+开始。原创 2023-03-18 13:35:28 · 667 阅读 · 0 评论 -
【spring】如何在所有BeanDefinition注册完后做扩展
1.通过实现bean工厂的后置处理器(BeanFactoryPostProcessor)来扩展。原创 2023-03-17 23:43:41 · 119 阅读 · 0 评论 -
【spring】spring如何在所有Bean创建完后做扩展
1.扩展方式一:基于SmartInitializingSingleton接口,在finishBeanFactoryInitialization(beanFactory);1.所有bean创建完:new ApplicationContext()->refresh()->finishBeanFactoryInitialization(循环所有的BeanDefinition,通过BeanFactory.getBean()生成所有的Bean),循环结束后所有的Bean创建完。原创 2023-03-17 23:22:33 · 302 阅读 · 0 评论 -
【spring】spring如何解决bean的循环依赖
4. 三级缓存:缓存的是函数接口,通过lambda表达式把方法传进去(把bean的实例和bean的名字传进去)(可能会有aop创建),但不会立即调用(如果在实例化后立即调用,所有aop不管bean是否循环依赖都会在实例化后创建proxy,但spring希望正常bean遵循生命周期,在初始化创建动态代理),第二次getBean的时候才会去调用三级缓存(实现了aop才会创建动态代理,没有实现则返回bean的实例),放入二级缓存(避免被多个依赖而重复创建),并从三级缓存中删除。1.构造函数的循环依赖没有解决。原创 2023-03-16 22:34:35 · 706 阅读 · 0 评论 -
【spring】bean的生命周期
6.如果bean实现了ApplicationContextAware接口,spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入。5.如果bean实现了BeanFactoryAware接口,spirng将调用setBeanFactory()方法,将BeanFactory容器实例传入。4.如果bean实现了BeanNameAware接口,spring将bean的ID传递给setBean-Name()方法。2.spring对bean进行实例化。原创 2023-03-16 21:53:24 · 317 阅读 · 0 评论 -
【spring】Bean生命周期的回调方法
2.实现InitiallizingBean接口。1.注解方式:@PostConstruct。2.实现DisposableBean接口。1.注解方式:@PreDestroy。注解方式>接口实现>@Bean。原创 2023-03-15 21:57:33 · 118 阅读 · 0 评论 -
【spring】自动装配(注入)的方式
1.在spring中,对象无需查找或创建与其关联的其他对象,由容器负责把依赖的对象引用赋予各个对象,使用autowired来配置自动装配的模式。2. byName:通过bean的名称进行自动装配,如果一个bean的property与另一个bean的name相同,就进行自动装配。5.autodetect:自动探测,如果有构造方法,通过constructor的方式自动装配,否则使用byType的方式自动装配。1.no:默认的方式是不进行自动装配,通过手工设置ref属性来进行装配bean。原创 2023-03-15 15:19:26 · 263 阅读 · 0 评论 -
【spring】自动装配需要注意什么
3. 基本数据类型不能自动装配简单的属性,有的话使用显示装配(手动注入基本数据类型是可以的<property value=" ">)2.可以用<constructor-arg>和<property>配置来定义依赖,可以覆盖自动注入。4.推荐使用手动装配@Autowired(根据类型,找到多个再根据名字) ref。1.一定要有set方法。原创 2023-03-15 15:01:48 · 66 阅读 · 0 评论 -
【spring】bean的装配
区别是@Autowired默认Bean的类型装配,@Resource默认按照Bean的实例名称进行装配。@Resource有name和type两个属性,name会解析为Bean的实例名称,type会解析为Bean的实例类型。5.@Autowired:用于对Bean的属性变量、属性的setter方法以及构造方法进行标注,配合对应的注解处理器完成Bean的自动装配工作。1.spring的 元素中包含一个 autowire 属性,通过设置 autowire 的属性值来自动装配Bean。原创 2023-03-14 22:25:24 · 337 阅读 · 0 评论