高级面试

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、线程池的内部处理

  节省 创建销毁 线程的时间与资源

  1. corePoolSize:线程池的核心线程数目,当一个请求进来时如果当前线程池中线程数量小于这个值,则直接通过ThreadFactory新建一个线程来处理这个请求,如果已有线程数量大于等于这个值则将请求放入阻塞队列中。
  2. maximumPoolSize:线程池的最大线程数目,当线程池数量已经等于corePoolSize并且阻塞队列也已经满了,则看线程数量是否小于maximumPoolSize:如果小于则创建一个线程来处理请求,否则使用“饱和策略”来拒绝这个请求。对于大于corePoolSize部分的线程,称作这部分线程为“idle threads”,这部分线程会有一个最大空闲时间,如果超过这个空闲时间还没有任务进来则将这些空闲线程回收。
  3. keepAliveTime和unit:这两个参数主要用来控制idle threads的最大空闲时间,超过这个空闲时间空闲线程将被回收。这里有一点需要注意,ThreadPoolExecutor中有一个属性:private volatile boolean allowCoreThreadTimeOut;,这个用来指定是否允许核心线程空闲超时回收,默认为false,即不允许核心线程超时回收,核心线程将一直等待新任务。如果设置这个参数为true,核心线程空闲超时后也可以被回收。
  4. workQueue:阻塞队列,超过corePoolSize部分的请求放入这个阻塞队列中等待执行。阻塞队列分为有界阻塞队列和无界阻塞队列。在创建阻塞队列时如果我们指定了这个队列的“capacity”则这个队列就是有界的,否则是无界的。这里有一点需要注意:使用线程池之前请明确是否真的需要无界阻塞队列,如果阻塞队列是无界的,会导致大量的请求堆积,进而造成内存溢出系统崩溃。
  5. threadFactory:是一个线程池工厂,主要用来为线程池创建线程,我们可以定制一个ThreadFactory来达到统一命名我们线程池中的线程的目的。
  6. 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进队列。适用于突发增长的流量。

15、concurrenthashma

posted @ 2019-10-09 13:20  乔儿的终极小迷弟  阅读(171)  评论(0编辑  收藏  举报