高级面试
1、分布式锁
基于数据库
基于redis
基于Zookeeper
2、 try catch finally return 执行顺序
https://www.cnblogs.com/pcheng/p/10968841.html
3、字符串在内存的位置
https://www.cnblogs.com/holten/p/5782596.html
4、多线程中,读大于写。怎样实现安全
volatile 一写多读
读写锁(ReadWritelock lock = new ReentrantReadWriteLock(); Lock getlock = lock.readLock(); Lock setlock = lock.writeLock(); 显式锁的一种) 少写多读
写时复制容器(CopyOnWrite) 只能保证最终一致性,不能保证实时一致 很少写,很多读
5、线程池的内部处理
节省 创建销毁 线程的时间与资源
- corePoolSize:线程池的核心线程数目,当一个请求进来时如果当前线程池中线程数量小于这个值,则直接通过ThreadFactory新建一个线程来处理这个请求,如果已有线程数量大于等于这个值则将请求放入阻塞队列中。
- maximumPoolSize:线程池的最大线程数目,当线程池数量已经等于corePoolSize并且阻塞队列也已经满了,则看线程数量是否小于maximumPoolSize:如果小于则创建一个线程来处理请求,否则使用“饱和策略”来拒绝这个请求。对于大于corePoolSize部分的线程,称作这部分线程为“idle threads”,这部分线程会有一个最大空闲时间,如果超过这个空闲时间还没有任务进来则将这些空闲线程回收。
- keepAliveTime和unit:这两个参数主要用来控制idle threads的最大空闲时间,超过这个空闲时间空闲线程将被回收。这里有一点需要注意,ThreadPoolExecutor中有一个属性:
private volatile boolean allowCoreThreadTimeOut;
,这个用来指定是否允许核心线程空闲超时回收,默认为false,即不允许核心线程超时回收,核心线程将一直等待新任务。如果设置这个参数为true,核心线程空闲超时后也可以被回收。 - workQueue:阻塞队列,超过corePoolSize部分的请求放入这个阻塞队列中等待执行。阻塞队列分为有界阻塞队列和无界阻塞队列。在创建阻塞队列时如果我们指定了这个队列的“capacity”则这个队列就是有界的,否则是无界的。这里有一点需要注意:使用线程池之前请明确是否真的需要无界阻塞队列,如果阻塞队列是无界的,会导致大量的请求堆积,进而造成内存溢出系统崩溃。
- threadFactory:是一个线程池工厂,主要用来为线程池创建线程,我们可以定制一个ThreadFactory来达到统一命名我们线程池中的线程的目的。
- handler:饱和策略,用来拒绝多余的请求。饱和策略有:CallerRunsPolicy:请求脱离线程池运行(调用者caller线程来运行这个任务);AbortPolicy:抛出RejectedExecutionException异常;DiscardPolicy:丢弃这个任务,即什么也不做;DiscardOldestPolicy:将阻塞队列中等待时间最久的任务删除(即队列头部的任务),将新的任务加入队尾。
6、IOC容器初始化流程
IOC:控制反转, 是个容器,HashMap
7.spring boot 启动机制
@springbootApplication
内置集成了springmvc 扫描mvc的类
集成了tomcat 启动tomcat
8、redis高性能的原因
1,存在内存中
2,value的数据简单
3,单线程的(多线程会导致资源争抢,在内存中已经很快了)
4,多路复用 (同时多次的请求,是同一个线程在处理)
5,resp协议,协议简单
9、控制缓存的更新(缓存一致性问题)
数据库与缓存数据一致性的问题
10、http与https
http数据不加密,可以被拦截,篡改,攻击
https 数据加密,身份验证,数据完整性
对称加密,就是一个密钥,可以加密也可以解密
非对称加密,用公钥加密的内容,必须用私钥才能解,反之亦然,一般用公钥加密,私钥解密。 公钥为所有人都知道,私钥为只有解密的知道。
https 传输加密过程 1、 请求https连接获取证书,(用私钥去CA机构认证产生公钥)服务器将公钥发给客户端。
2、客户端生成随机数,用公钥对随机数加密,发送给服务器加密的随机数
3、服务器用私钥解密出随机数
11、session与cookie
cookie存在浏览器客户端,session存在与服务器内存。
第一次请求服务器setcookie后用response返回给浏览器,浏览器将cookie存储,之后浏览器的每次请求会在request携带cookie
12、一致性hash算法
hash算法足够分散。分布式可以分散到各个服务器。Hash(n)%number(服务器个数)
如果加一台服务器,则需要重新计算。。。‘
一致性hash算法是对2^32取模,得到K1的值,在hash环中顺时针找最近的服务器
解决分布式负载均衡
13、MQ发生重复消费怎样解决
生产者-->消息队列-->消费者
生产者与消息队列之前发生问题,生产者会重试,导致重复消息
消息队列与消费者之前发生问题,消息队列会重试,导致重复消息
解决重复消息使用幂等操作:update table set count = 10 where id = 1;(幂等,重复操作不影响) update table set count = count +1 where id = 1;(非幂等)
使用乐观锁,带上版本号
建去重表,唯一列,每次消息去查询去重表是否有该id,有则不处理。
14、限流策略,令牌桶,漏斗算法
令牌桶:请求之前需要先拿一个令牌才可请求,如果去令牌池拿令牌发现没有令牌可拿,则拒绝或i进队列。适用于突发增长的流量。