1.用户态和核心态
用户态与内核态的概念就是C P U 指令集权限的区别
用户态操作的cpu指令集的权限低比如 I O
读写、网卡访问、申请内存都不能。
内存划分不同
2依赖注入的三种方法?
字段注入(注解)
构造器注入
setter方法注入
3.什么是依赖,什么是注入?
4.循环依赖怎么解决?三级缓存不了什么注入方法?
循环依赖的问题是通过三级缓存机制来解决的。Spring的默认单例bean创建过程中包括三个缓存完整初始化的bean map,未完整初始化的bean map ,以及存储bean代理工厂的map
不能解决多例bean 解决方法 变为单例
不能解决 构造器注入 解决方法 懒加载或者使用setter注入方法
重新设计结构:这是最直接也是最彻底的方式。重新设计你的类和组件,避免它们之间产生直接的相互依赖。这可能需要引入新的中间类或接口。
5.Runnable和Callable、submit和excute
Callable
接口与Runnable
接口一样,都是被定义为一个函数式接口,且与Runnable
接口一样仅提供了一个方法call()
。与Runnable
接口的不同点在于:
call()
方法可以有返回值,返回类型为泛型V
,代表着支持所有类型的返回值。
call()
方法定义时声明了可以抛出异常:throws Exception
,而run()
则不行。
submit方法,它是提交有返回值任务的一种方式,内部使用未来任务(FutureTask)包装,再交给execute()去执行,最后返回未来任务(FutureTask)本身。FutureTask包装的都是有返回值的Callable类型的任务。
6.ConcurrentHashmap扩容,segment会变吗?
1.wait()的底层
2.spring 为什么默认单例bean
- 少创建实例
- 垃圾回收
- 缓存快速获取
https://www.cnblogs.com/east7/p/14702326.html
3.最左匹配原则
组成联合索引的多个列,越靠左边优先级越高,同时也只有SQL
查询条件中,包含了最左的字段,才能使用联合索引 (where后的顺序不重要)
建立联合索引时,一定要考虑优先级,查询频率最高的字段应当放首位。
联合索引的最左匹配原则,在遇到范围查询(如 >、<)的时候,就会停止匹配,也就是范围查询的字段可以用到联合索引,但是在范围查询字段的后面的字段无法用到联合索引。注意,对于 >=、<=、BETWEEN、like 前缀匹配的范围查询,并不会停止匹配
4.SETNX 实现分布式锁会有哪些问题
1.不可重入
2.不可重试
3.超时释放
4.主从一致性问题
redission分布式锁:
1.利用hash结构记录线程标识和可重入次数
2.利用watchdog续约锁时间,利用信号量控制锁重试
5.@Transaction注解失效的情况
同一个类中方法调用,导致@Transactional失效
异常被你的catch“吃了”导致@Transactional失效
6.八种 HTTP 请求
7.ThreadLocal 底层设计
8.RedLock 加锁原理
9.Redis 的多路复用模型
10.Redis 数据结构底层实现
11.创建两个线程交替打印 AB
12.创建联合索引的时候为什么要把出现频率高的字段放在前面
因为将查询频率越高的字段放首位,就代表着查询时命中索引的几率越大。
13.秒杀模块用分布式锁之后执行效率太低,你该如何解决(异步下单,把校验和下单操作分开执行)
14.MySQL 中主键为什么是递增的
15.drop / truncate / delete
drop:删除内容和定义,释放空间。(表结构和数据一同删除)
truncate:删除内容,释放空间,但不删除定义。(表结构还在,数据删除)
delete:删除内容,不删除定义,也不释放空间
释放空间可以体现在:
通过delete删除的行数据是不释放空间的,如果表id是递增式的话,那么表数据的id就可能不是连续的;而通过truncate删除数据是释放空间的,如果表id是递增式的话,新增数据的id又是从头开始,而不是在已删数据的最大id值上递增。
16.分布式锁除了有哪些实现方式(Redis / ZooKeeper)
17.有一个业务非常慢,在执行的过程中分布式锁过期了怎么办
18.你所了解的设计模式(不敢说多 怕要求手写)
工厂模式
代理模式
模板方法模式
单例模式
责任链模式
观察者模式
19.controller 之间如何相互调用
20.ReentrantLock 如何实现可重入
判断当前线程current是否为独占锁线程OwnerThread,如果是则代表着当前线程已经获取过锁资源还未释放,属于锁重入,那么对state进行自增1,返回true。