面试题整理(1)

每天五道面试题!只记录答案,不标出源码,有什么不对的地方欢迎评论,共同进步。

1. CopyOnWriteArrayList原理

  原理:不同的线程访问同一资源时,只有在写操作时才会复制一份新的数据,否则都是访问同一数据,具体流程为先拷贝存储的数组,然后添加元素到拷贝好的数组中,然后用现在的数组去替换成员变量的数组。底层源码是add操作时通过synchronized加锁,保证只有一个线程进行变更,会将数组复制一份,操作副本,操作完成后替换数组。

  优势:对于读多写少的数据使用这个很好,例如配置、黑名单、地址等,只有在写操作的时候才会加锁。

  劣势:1、只能保持数组的一致性,可能会读到旧的数据

     2、对象如果比较大,频繁地替换会很消耗资源,会引发GC问题,这时我们可以考虑其他容器。

2.接口如何防止盗刷

  1、网关控制流量洪峰,对一个时间段内出现的流量异常,可以拒绝请求。

  2、源ip限制请求的个数,对请求源ip请求个数进行限制。

  3、HTTP请求头信息校验,如host,user-agent,referer。

  4、对用户唯一身份uid进行限制和校验。例如基本长度、组合方式,甚至有效性(可以使用JSR(Java Specification Requests)约束)。

  5、前后端协议采用二进制方式交互或协议采用签名机制。

  6、人机验证,验证码、短信验证、滑动图片验证。

3.线程池核心工具类ThreadPoolExecutor的七个参数

  1、corePoolSize:线程池保有的最少线程数。

  2、maximumPoolSize:线程池创建的最大线程数。

  3、keepAliveTime:如果一个线程空闲了keepAliveTime&unit这么久,且线程数大于corePoolSize,那么这个线程将会被回收。

  4、unit:keepAliveTime的时间单位。

  5、wordQueue:任务队列

  6、threadFactory:线程工厂对象,可以自定义如何创建线程,如指定name。

  7、handler:自定义任务的拒绝策略。

      四种拒绝策略:(1)AbortPolicy:默认的拒绝策略,throws RejectedExecutionException。

             (2)CallerRunsPolicy:提交任务的线程自己去执行。

             (3)DiscardPolicy:直接丢弃任务,不抛出任何异常。

             (4)DiscardOldestPolicy:丢弃线程池中最老的任务,加入新的任务。

4.Elasticsearch和MySql的区别

  MySql:关系型数据库。层次:Database -> Table -> Row -> Line。索引是B+树(一般来说)。

  Elasticsearch:非关系型数据库。层次:Index -> Type -> Document -> Filed。索引是倒排索引(由属性值来确定记录的位置的索引)。

  基于分词后的全文检索,这是es的强项,而对于关系型数据库mysql是灾难,因为es分词后,每个字都可以利用FST高速找到倒排索引的位置,并迅速获取文档id的列表,而对于mysql来说,如果检索的是中间的字段,只能全表扫描。

  精确检索,两种相差不大,有些情况下mysql的可能会更快些,如果mysql的非聚合索引用上了覆盖索引,无需回表,则速度可能更快,es还是通过FST找到倒排索引的位置并获取文档id列表,再根据文档id获取文档并根据相关度算分进行排序,但es还有个杀手锏,即天然的分布式使得在大数据量面前可以通过分片降低每个分片的检索规模,并且可以并行检索提升效率,用filter时更是可以直接跳过检索直接走缓存。

5.TCP三次握手

  TCP是面向连接的可靠的传输层协议。基于此,很多文章写到三次握手就是类似A对B说“你好”,B说“收到,你好”,之后A说“收到”,所以如果只有两次握手的话只能保证A向B是可连接,不能保证B向A可连接。实际这种说法太片面。

  为了保证可靠性和流控制机制的信息,包括Socket、序列号以及窗口大小叫做连接。所以,建立 TCP 连接就是通信的双方需要对上述的三种信息达成共识,连接中的一对 Socket 是由互联网地址标志符和端口组成的,窗口大小主要用来做流控制,最后的序列号是用来追踪通信发起方发送的数据包序号,接收方可以通过序列号向发送方确认某个数据包的成功接收。

  TCP三次握手的关键信息实际上是避免历史上的重复连接,因为网络是不可靠的,发送方可能会发送多次连接请求(SYN),有些连接实际上是无效的,所以接收方返回消息的时候要发送一个(SYN+ACK),ACK来确认有效的序号(序号的作用就是保证不重传、不丢包、按序到达),最后发送方通过ACK来确认这个连接是历史连接还是当前连接,历史连接就中止,当前连接就发送ACK确认消息,通信双方就会建立连接。

  使用三次握手就是将最终控制权交给了发送方,这也就是TCP使用三次握手的最主要原因。

  两次握手不行:无法避免历史错误连接的初始化,浪费了接收方的资源。

  四次握手没必要:TCP协议的设计让我们可以同时传递SYN+ACK两个控制信息,减少了通信次数,所以不需要更多的通信次数传输相同的信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值