其他其他其他

一、集合快速失败机制

一不小心就踩坑的fail-fast是个什么鬼?-HollisChuang's Blog

二、volatile实现原理

再有人问你volatile是什么,把这篇文章也发给他。-HollisChuang's Blog

三、BIO、NIO、AIO

BIO:是阻塞IO,面向流的,在建立链接(accpet)、read和write会阻塞。

NIO:是非阻塞IO ,面向缓冲区的,就是所有的socket请求都不会被阻塞,在一个线程中,selector会轮询这些channel,每次获取一些有事件的channel,根据selectionkeys区别不同类型事件进行不同处理。

AIO:是异步非阻塞IO,通过buffer去异步读写,操作系统异步将数据写到buffer里,执行完会回调通知客户端进行读写操作。

四、静态代码块、构造代码块、构造函数加载顺序

单个类中执行顺序:静态代码块、静态成员变量>构造代码块、非静态成员变量>构造函数。

涉及到继承的执行顺序:父类的静态代码块、父类静态成员变量>子类的静态代码块、子类静态成员变量>父类的构造代码块、父类非静态成员变量>父类的构造函数>子类的构造代码块、子类非静态成员变量>子类的构造函数

注意:

  1. 静态代码块只会在类被载入内存时加载一次,构造代码块和构造函数都是在对象创建的时候执行,创建几个对象就会执行几次。
  2. 静态代码块和静态成员变量,加载顺序由编写顺序决定。
  3. 构造代码块和非静态成员变量,加载顺序由编写顺序决定。

五、接口和抽象类的区别

1、接口

  • 接口是把隐式的公共方法和属性组合起来,封装成特定功能的一个集合。用于规范。
  • 一个类实现了接口,就必须实现接口中的所有的抽象方法。
  • 接口中不能有非抽象的方法。
  • 接口可以包含变量、方法;变量被隐士指定为public static final,方法被隐士指定为public abstract(JDK1.8之前)
  • JDK1.8中对接口增加了新的特性:(1)、默认方法(default method):JDK 1.8允许给接口添加非抽象的方法实现,但必须使用default关键字修饰;定义了default的方法可以不被实现子类所实现,但只能被实现子类的对象调用;如果子类实现了多个接口,并且这些接口包含一样的默认方法,则子类必须重写默认方法;(2)、静态方法(static method):JDK 1.8中允许使用static关键字修饰一个方法,并提供实现,称为接口静态方法。接口静态方法只能通过接口调用(接口名.静态方法名)。

2、抽象类

  • 从子类中发现了公共的东西,泛化出父类,然后子类继承父类。用于共性。
  • 一个子类继承一个抽象类,则子类必须实现父类抽象方法,否则子类也必须定义为抽象类;
  • 抽象类中可以有非抽象的方法。
  • 抽象类可以包含属性、方法、构造方法,但是构造方法不能用于实例化,主要用途是被子类调用。

五、object类

六、Class类

1、forName方法:输入需要加载的类的全路径名,得到类的Class对象。Class.forName(“类的全限定名”)

2、newInstance方法:创建一个对象。

3、getFields、getField、getDeclaredFields

(1)获取public修饰的属性域
(2)根据输入的属性名查找对应的属性域
(3)获取Class对象中的属性域

4、getMethods、getMethod、getDeclaredMethods

(1)获取public修饰的方法
(2)根据输入的方法名和入参类型,查找对应的方法
(3)获取Class对象中的方法

5、getConstructors、getConstructor、getDeclaredConstructors

(1)获取public修饰的构造函数
(2)根据输入的方法名和入参类型,查找对应的构造函数
(3)获取Class对象中的构造函数

6、getClassLoader:获取当前类的类加载器

7、isInstance(native方法:用于判断入参是否为当前Class对象(子类)的实现类。

8、isInterface(native方法):判断是否为接口

9、isArray(native方法):是否为数组

10、isPrimitive(native方法):用于判断这个Class对象是否为基本类型,如int,byte,char等

七、String为什么不可变

  • String类被final修饰,不可被继承。
  • String的成员变量char数组value被final修饰,初始化后不可更改引用。
  • String的成员变量value访问修饰符为private,不对外界提供修改value数组值的方法。

设计成不可变的好处

  • 实现字符串常量池
  • 为String对象缓存HashCode ,HashCode不变。

八、序列化

序列化是将对象的状态信息转换为可以存储或传输的形式的过程

八、nginx反向代理

通过反向代理做负载均衡,多个客户端给服务器发送的请求,Nginx 服务器接收到之后,按照一定的规则分发给了某个后端的业务处理服务器进行处理。

负载均衡策略

  • 轮询:每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 
  • 加权轮询:指定轮询几率,权重和访问比率成正比,用于后端服务器性能不均的情况。 
  • ip_hash:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 
  • fair:按后端服务器的响应时间来分配请求,响应时间短的优先分配。 
  • url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
  • least_conn:把请求转发给连接数较少的后端服务器。

十、rocketMQ 

优点:解耦、削峰、异步

缺点:系统可用性降低、系统复杂度提高、一致性问题

1、流程:主要分为四种角色,NameServer、Broker、Producer、Consumer。NameServer是路由中心。Broker消息中转角色,负责存储消息,转发消息。Producer是消息生产者,Consumer是生产消费者。

  • Broker启动时向所有的NameServer进行注册,NameServer与每台Broker保持长链接,并间隔30s发送心跳检测来确定Broker是否存活。
  • Producer会通过NameServer获取Broker地址列表,选一台消息服务器进行消息发送,Producer每隔30s会从NameServer获取topic的最新队列情况,Producer每隔30s也会向所有关联的broker发送心跳,如果Broker在2分钟内没有收到心跳数据,则关闭与Producer的连接。
  • Consumer通过NameServer寻找topic对应的Broker进行消费。Consumer每隔30s会从NameServer获取topic的最新队列情况,Consumer每隔30s也会向所有关联的broker发送心跳。若某个连接2分钟内没有发送心跳数据,则关闭连接;并向该Consumer Group的所有Consumer发出通知,Group内的Consumer重新分配队列,然后继续消费。

2、rocketMQ是支持事务消息的,实现原理:基于两段提交和定时事务状态回查来决定消息最终是提交还是回滚的。

  • 消息生产者在发送消息时先发送一个状态为prepare的半消息。
  • 消息服务器在收到prepare消息时,会将该消息备份存储到半消息队列中。
  • 然后消息服务器开启一个定时任务向消息生产者发起消息事务状态回查,如果回查的状态为提交,则消息服务器提交消息,消费者可以看到该消息。如果回查的状态为回滚,消息服务器将回滚消息。如果超过回查次数默认回滚消息。

 3、rocketMQ支持局部顺序消息:保证同一个消息队列上的消息顺序消费,不支持消息全局顺序消费,如果要实现某一topic的全局顺序消费,可以将该主题的队列数设置为1。如果想保证消息局部顺序消费,只需根据队列选择器将这些消息放到同一个队列中。

4、消息发送异常处理机制:重试和Broker规避。Broker规避就是在一次消息发送过程中发现错误,在一段时间内,消息生产者不会选择该Broker上的消息队列,提高发送消息成功率。

5、消息消费异常处理机制:当消息消费失败时,为了防止消息丢失,会将消息重新发回Broker端,先根据重试级别把失败消息放到延迟队列中,定时任务根据重试级别再将失败消息保存到重试队列中。如果一条消息超过最大重试次数,会被放到死信队列中,需要人工处理。

6、消息重复发送问题:用一张表来记录消息发送的状态,在发送消息的时候,先查看一下这张表,是不是发送过相同的消息.如果发送过,就不再发送。

7、消息重复消费问题:保证幂等性来解决。在redis中存个唯一标识,每次操作数据之前查下唯一标识是否存在。存在的话就不做处理,不存在的话,就消费消息做相应操作。

8、怎么防止消息丢失

  • 生产者生产消息发到Broker的过程中由于网络等原因导致消息丢失,使用事务消息避免消息丢失。
  • Broker异步刷盘Broker宕机导致消息丢失,使用同步刷盘避免消息丢失。
  • 消费者异步消费消息时导致消息丢失,消费者异步消费消息,Broker接收到消费者消费成功,但是此时消费者宕机,消息并没有消费完成,所以导致消息丢失。可以使用同步消费消息,消费者消费完成后再通知Broker。

十一、拦截器和过滤器的区别

拦截器基于反射实现的,过滤器基于方法回调实现的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值