JDK 中有哪些设计模式?
参考答案:JDK 常用的设计模式如下:
① 工厂模式
java.text.DateFormat 工具类,它用于格式化一个本地日期或者时间。
public final static DateFormat getDateInstance();
public final static DateFormat getDateInstance(int style);
public final static DateFormat getDateInstance(int style,Locale locale);
加密类
KeyGenerator keyGenerat
分布式事务:在分布式系统中一次操作需要由多个服务协同完成,这种由不同的服务之间通过网络协同完成的事务称为分布式事务
2PC,两阶段提交,将事务的提交过程分为资源准备和资源提交两个阶段,并且由事务协调者来协调所有事务参与者,如果准备阶段所有事务参与者都预留资源成功,则进行第二阶段的资源提交,否则事务协调者回滚资源。
1、第一阶段:准备阶段
由事务协调者询问通知各个事务参与者,是否准备好了执行事务,具体流程图如下:
* ① 协调者向所有参与者发送事务内容,询问是否可以提交事务,并等待答复
* ② 各参与者执行本地事务操作,将 undo 和 redo 信息记入事务日志中(但不提交事务)
推拉模式
首先明确一下推拉模式到底是在讨论消息队列的哪一个步骤,一般而言我们在谈论推拉模式的时候指的是 Comsumer 和 Broker 之间的交互。
默认的认为 Producer 与 Broker 之间就是推的方式,即 Producer 将消息推送给 Broker,而不是 Broker 主动去拉取消息。
想象一下,如果需要 Broker 去拉取消息,那么 Producer 就必须在本地通过日志的形式保存消息来等待 Broker 的拉取,如果有很多生产者的话,那么消息的可靠性不仅仅靠 Broker 自身,还需要靠成百上千的 Producer。
Broker 还能靠多副本等机制来保证消息
消息队列可谓是高并发下的必备中间件了,而 Kafka 作为其中的佼佼者,经常被我们使用到各种各样的场景下。
随着 Kafka 而来得,还有三个问题:消息丢失、消息重复、消息顺序。我们首先聊聊消息丢失的问题。
可靠性级别
回到标题提出的问题:我们是否真的能保证 Kafka 消息不丢失?
答案是:我们无法保证 Kafka 消息不丢失,只能保证某种程度下,消息不丢失。
这里所说的某些情况,从严重程度依次为:Kafka 宕机、服务器宕机、机房地震、城市毁灭、地球毁灭。不要觉得树哥在危言耸听,如果你的服务器部署在乌克兰的首都,那是不是就会遭遇城市毁灭的风险了?因此,我们根据业务的重要程度,设置
问题:如何实现拦截器?
参考答案:在 Spring Boot 中拦截器的实现分为两步:
1. 创建一个普通的拦截器,实现 HandlerInterceptor 接口,并重写接口中的相关方法;
2. 将上一步创建的拦截器加入到 Spring Boot 的配置文件中,并配置拦截规则。
具体实现如下。
① 实现自定义拦截器
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframewo
问题:Spring 和 Spring Boot 有什么区别?
参考答案:作为 Java 开发人员对 Spring 框架都很熟悉,Spring 为 Java 程序提供了全面的基础架构支持,包含了很多非常实用的功能,如 Spring JDBC、Spring AOP、Spring ORM、Spring Test 等,这些模块的出现,大大的缩短了应用程序的开发时间,同时提高了应用开发的效率。
Spring Boot 本质上是 Spring 框架的延伸和扩展,它的诞生是为了简化 Spring 框架初始搭建以及开发的过程,使用它可以不再依赖 Spring 应用程序中的 XML 配置,为更快、更高效的开发
问题:介绍一下 Spring?
参考答案:Spring 是一款顶级开源框架,它是包含了众多工具方法的 IoC 容器。
Spring 包含了很多模块,比如 spring-core、spring-beans、spring-aop、spring-context、spring-expression、spring-test 等,使用 Spring 可以帮我们快速的开发 Java 程序。
问题:Spring 有什么优点?
参考答案:Spring 优点如下:
1. 开源免费的热门框架,稳定性高、解决问题成本低;
2. 方便集成各种优秀的框架;
3. 降低了代码耦合性,通过 Spring 提供的
sleep 方法和 wait 方法都是用来将线程进入休眠状态的,并且 sleep 和 wait 方法都可以响应 interrupt 中断,也就是线程在休眠的过程中,如果收到中断信号,都可以进行响应,并抛出 InterruptedException 异常。那 sleep 和 wait 的区别都有哪些呢?接下来,我们一起来看。
区别一:语法使用不同
wait 方法必须配合 synchronized 一起使用,不然在运行时就会抛出 IllegalMonitorStateException 的异常,如下代码所示:
初看代码好像没啥问题,编译器也没报错,然而当我们运行以上程序时就会发生如下错误:
一、限流操作:
限流那些方法
常见的限流:
* Netflix的hystrix
* 阿里系开源的sentinel
* 说白了限流,为了处理高并发接口那些方式:队列,线程,线程池,消息队列、 kafka、中间件、sentinel:直接拒绝、Warm Up、匀速排队等
技术层面:
* 判断是否有相同的请求,可以通过自身缓存挡住相同请求
* 用负载均衡,比如nginx
* 用缓存数据库,把热点数据get到缓存中,redis,ES
* 善于使用连接池
业务层面:
*
判断对象是否可回收
如何判断一个对象属于垃圾对象呢?
引用计数法
对于一个对象 A,只要有任意一个对象引用了 A,则 A 的计数器加 1,当引用失效的时候,引用计数器就减 1。如果 A 的应用计数器为 0,则对象 A 就不可能再被使用。
缺点:虽然循环引用的问题可通过 Recycler 算法解决,但是在多线程环境下,引用计数变更也要进行昂贵的同步操作,性能较低,早期的编程语言会采用此算法。
可达性分析算法
通过一系列的称为 GC Roots 的对象作为起始点,从这些节点开始向下搜索,搜索所走过的循环称为引用链。当一个对象到 GC Roots 没有任何引用链的时候,则证明此对象是不可达