java后端开发面试题总结(三)

1. 线程池

<1> 线程的生命周期,创建和销毁都是有一些代价的,需要JVM辅助的,对内存消耗也很大,所以都是创建固定的量的线程,而不是多少个任务创建多少个线程,线程的复用很有必要

<2> 线程池的好处:
1- 加快了响应的速度

2- 合理利用了CPU和内存

3- 统一管理

<3> 线程池应用的场合:服务器接收到大量请求时,使用线程池技术是非常合适的,他可以大大减少线程的创建和销毁的次数,提高服务器的工作效率

<4> 实际上,在开发中有超过五个线程的需求时,就可以使用线程池来管理

2. 添加线程的规则:

<1> 1- 如果线程数小于corePoolSize,创建一个新的线程来运行新任务

<2> 如果线程数等于(或大于)corePoolSize但是少于maxPoolSize,则将任务放入队列中

<3> 如果队列已满,并且线程数小于maxPoolsize。则创建一个新的线程

<4> 如果队列已满,并且线程数大于或者等于maxPoolSize,则拒绝

总结:是否需要增加线程的判断顺序时:corePoolSzie–>workQueue–>maxPoolSize

3.增减线程的特点

<1> 通过设置corePoolSize和maxPoolSize相同,就可以创建一个固定大小的线程池

<2> 线程池希望保持较少的线程数,并且只有在负载变得很大的时候才增加它

<3> 通过设置maxPoolSize为很高的值,可以允许线程池容纳任意数量的并发任务

<4>只有在队列填满的时候才会创建多余corePoolSize的线程数,如果使用的时无界队列,那么线程数用于都不会超过corePoolSize

4. 线程池里的线程数量设定为多少比较合适

<1> CPU密集型(加密,计算hash等):最佳线程数为CPU核心的1-2背

<2> 耗时IO型(读写数据库,文件,网络读写等):最佳线程数一般会大于CPU核心数很多倍

参考推荐的计算方法:线程数 = CPU核心数*(1+平均等待时间/平均工作时间)

5. 单体架构,集群,分布式,微服务的理解

<1> 单体架构:一台服务器上完成各个功能模块

<2> 集群:按单体架构复制出多个服务器(同一个业务部署在多个服务器上) #分散压力

<3> 分布式:将各个模块拆分为独立的服务器(一个业务拆分成多个子业务,部署在不同的服务器上) #分散能力

<4>分布式和微服务的区别,微服务是架构设计方式(逻辑上的架构),分布式是系统部署方式(实际物理上的架构),可以说要实现微服务这种逻辑架构目前都是用分布式来实现的

6. CAP理论是什么(三者不可兼得,最多兼得两种,P一般无法避免,一般都要存在,所以一般都是AP,CP)

<1> C(Consistency,一致性):读操作是否总能读到前一个写操作的结果

<2> A(Avaliablity,可用性):非故障节点应该在合理的时间内做出合理的响应

<3> P(partition tolerance,分区容错性):当出现网络分区现象后,系统能够继续运行

7. Docker的用途

<1> 提供统一环境

<2> 提供快速拓展,弹性伸缩的云服务

<3> 防止其他用户的进程把服务器资源占用过多

8. Nginx优点

<1> 高并发,高性能

<2> 可扩展性好

<3> 高可靠性

<4> 热部署

<5> 开源,可商用

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值