2021最新面试整理
文章平均质量分 89
2021最新面试整理
奋斗的小媛
这个作者很懒,什么都没留下…
展开
-
Java程序死锁问题定位与解决
一、概述死锁是指两个或两个以上的进程在执行过程中,因争抢资源而造成的一种互相等待的现象,若无外力干涉它们将无法推进,如果系统资源充足,进程的资源请求能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。死锁产生的原因:【1】系统资源不足;【2】资源分配不当;【3】进程运行推进的顺序不合适;形成死锁的四个必要条件:**【1】互斥条件:**一个资源每次只能被一个进程使用。**【2】请求与保持条件:**一个进程因请求资源而阻塞时,对已获得的资源保持不放。**【3】不剥夺条件:*原创 2021-05-12 00:13:30 · 300 阅读 · 1 评论 -
RabbitMQ存储和队列结构
了解一些 RabbitMQ 的实现原理也是很有必要的,它可以让你在遇到问题时能透过现象看本质。比如一个队列的内部存储其实是由5个子队列来流转运作的,队列中的消息可以有4种不同的状态等,通过这些可以明白在使用 RabbitMQ 时尽量不要有过多的消息堆积,不然会影响整体服务的性能。存储机制RabbitMQ存储层包含两个部分:队列索引和消息存储。RabbitMQ消息有两种类型:持久化消息和非持久化消息,这两种消息都会被写入磁盘。持久化消息在到达队列时写入磁盘,同时会内存中保存一份备份,当内存吃紧时.转载 2021-05-06 23:38:40 · 512 阅读 · 0 评论 -
SpringCloud Ribbon 负载均衡
Spring Cloud Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具。可以将面向服务的 REST 模板请求自动转化成客户端负载均衡的服务调用。Spring Cloud Ribbon 虽然是一个工具类框架,但它不像服务注册中心、配置中心、API网关那样需要独立部署。但是它几乎存在于每一个 Spring Cloud 构建的微服务和基础设置中。因为微服务间的调用,API 网关的请求转发等内容,实际上都是通过 Ribbon 来实现的,包括 Feign 它也是基于 Ribbon 实现的工具。原创 2021-05-05 15:09:09 · 212 阅读 · 0 评论 -
Java面试——TCP与HTTP
一、Session 和 cookie 的区别【1】Cookie 保存在客户端,未设置存储时间的 Cookie,关闭浏览器会话 Cookie 就会被删除;设置了存储时间的 Cookie 保存在用户设备的磁盘中直到过期,同时 Cookie 在客户端所以可以伪造,不是十分安全,敏感数据不易保存。Session 保存在服务器端,存储在 IIS 的进程开辟的内存中,而 Session 过多会消耗服务器资源,所以尽量少使用 Session。【2】Session 是服务器用来跟踪用户的一种手段,每个 Session都原创 2020-07-08 23:36:55 · 620 阅读 · 0 评论 -
聊聊IO多路复用之select、poll、epoll详解
IO多路复用之select、poll、epoll详解IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。IO多路复用适用如下场合:当客户处理多个描述符时(一般是交互式输入和网络套接口),必须使用I/O复用。当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现。如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用。如果一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用。如果一个服务器要处理多个服务或多个协议,转载 2021-05-03 22:17:50 · 207 阅读 · 0 评论 -
Redis 线程模型
一、概述【1】Redis 是基于 Reactor模式开发的网络事件处理器:这个处理器被称为文件事件处理器(file event handler),这个文件事件处理器是单线程的,所以 Redis 才叫做单线程的模型:■ 文件事件处理器使用 I/O 多路复用(multiplexing)机制监听多个套接字 Socket,根据 Socket 上的事件来选择对应的事件处理器进行处理。■ 当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关闭(close)等操作时。与操作原创 2021-05-03 20:56:01 · 202 阅读 · 0 评论 -
AQS 锁核心类详解
AQS(AbstractQuenedSynchronizer 抽象队列同步器) 是一个用来构建锁和同步器的框架,使用 AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Semaphore,其他的诸如 ReentrantReadWriteLock,SynchronousQueue,FutureTask等等皆是基于 AQS的。AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。当然,我们自己也能利用 AQS非常轻松容易地构造出符合我们自己需求原创 2021-04-27 23:38:02 · 311 阅读 · 0 评论 -
ReentrantLock 锁详解
ReentrantLock 支持公平锁和非公平锁,可重入锁 ReentrantLock的底层是通过 **AQS[链接]**实现。一、BAT 大厂的面试题**【1】**什么是可重入,什么是可重入锁? 它用来解决什么问题?【2】ReentrantLock 的核心是 AQS,那么它怎么来实现的,继承吗? 说说其类内部结构关系。【3】ReentrantLock 是如何实现公平锁的?【4】ReentrantLock 是如何实现非公平锁的?【5】ReentrantLock 默认实现的是公平还是非公平锁.原创 2021-04-27 23:13:55 · 3431 阅读 · 7 评论 -
Synchronized原理分析
Synchronized原理分析加锁和释放锁的原理深入JVM看字节码,创建如下的代码:1 public class SynchronizedDemo2 {2 Object object = new Object();3 public void method1() {4 synchronized (object) {5 6 }7 }8 }使用 javac命令进行编译生成 .class文件>javac Synchronize原创 2021-04-25 20:17:54 · 267 阅读 · 0 评论 -
Redis 基础数据结构
Reids 所有的数据结构都以唯一的 key 字符串作为名称,然后通过这个唯一的 key 值来获取相应的 value 数据。不同的数据结构差异就在于 value 的结构不一样。*一、*Redis 五大数据类型【1】String(字符串):String 是 Redis 最基本的类型,一个 key 对应一个 value。String 类型是二进制安全的。意思是 Redis 的 String 可以包含任何数据。一个键最大能存储 512MB。【2】Hash(哈希):Hash 是一个键值对集合,类似 Ja.原创 2021-04-22 23:24:09 · 710 阅读 · 8 评论 -
用 Java 自己实现一个 LRU
LRU(Least Recently Used:最近最少使用):简单的说,就是保证基本的 Cache容量,如果超过容量则必须丢掉最不常用的缓存数据,再添加最新的缓存。每次读取缓存都会改变缓存的使用时间,将缓存的存在时间重新刷新。其实,就是清理缓冲的一种策略。我们可以通过双向链表的数据结构实现 LRU Cache,链表头(head)保存最新获取和存储的数据值,链表尾(tail)既为最不常使用的值,当需要清理时,清理链表的 tail 即可,并将前一个元素设置为tail。结构图如下:[外链图片转存失败,源站可原创 2021-04-20 19:24:11 · 218 阅读 · 0 评论 -
MySQL 查询执行的过程
查询的生命周期大致可以按照顺序来看:从客户端到服务端,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端。其中 “执行” 可以认为是整个生命周期中最重要的阶段,其中包括了大量为了检索数据到存储引擎的调用以及调用后的数据处理,包括排序分组等。当希望 MySQL 能够以高性能的方式运行查询时,最好的办法就是弄清楚 MySQL 是如何优化和执行查询的。MySQL 执行一个查询的过程,如下:【1】首先我们会连接到这个数据库上,这时候接待你的就是连接器。连接器负责跟客户端建立连接、获取权限、维持和管理原创 2021-04-19 23:16:49 · 223 阅读 · 0 评论 -
MyBatis缓存机制
前言MyBatis是常见的Java数据库访问层框架。在日常工作中,开发人员多数情况下是使用MyBatis的默认缓存配置,但是MyBatis缓存机制有一些不足之处,在使用中容易引起脏数据,形成一些潜在的隐患。个人在业务开发中也处理过一些由于MyBatis缓存引发的开发问题,带着个人的兴趣,希望从应用及源码的角度为读者梳理MyBatis缓存机制。本次分析中涉及到的代码和数据库表均放在GitHub上,地址: mybatis-cache-demo 。目录本文按照以下顺序展开。一级缓存介绍及相关配置。一原创 2021-04-19 23:16:05 · 204 阅读 · 0 评论 -
MyBatis 整体架构【包含 SQL执行流程】
Mybatis 的整体架构分为三层,分别是基础支持层、核心处理层和接口层。基础支持层为核心处理层的功能提供了良好的支撑。一、接口层在不与 Spring 集成的情况下,使用 MyBatis 执行数据库的操作主要如下:InputStream is = Resources.getResourceAsStream("myBatis-config.xml");SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();SqlSess原创 2021-04-19 23:14:44 · 180 阅读 · 0 评论 -
Java NIO浅析
NIO(Non-blocking I/O,在Java领域,也称为New I/O),是一种同步非阻塞的I/O模型,也是 I/O多路复用的基础,已经被越来越多地应用到大型应用服务器,成为解决高并发与大量连接、I/O处理问题的有效方式。那么NIO的本质是什么样的呢?它是怎样与事件模型结合来解放线程、提高系统吞吐的呢?本文会从传统的阻塞I/O和线程池模型面临的问题讲起,然后对比几种常见 I/O模型,一步步分析NIO怎么利用事件模型处理I/O,解决线程池瓶颈处理海量连接,包括利用面向事件的方式编写服务端/客户原创 2021-04-19 22:46:05 · 123 阅读 · 0 评论 -
ThreadLocal 类
ThreadLocal 并不是一个Thread,而是 ThreadLocalVariable(线程局部变量)。也许把它命名为 ThreadLocalVar更加合适。线程局部变量就是为每一个使用该变量的线程都提供一个变量值的副本,是 Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。ThreadLocal是除了加锁这种同步方式之外的另一种保证多线程访问出现线程不安全的方式。从线程的角度看,每个线程都保持一个对其线程局部变量副本的隐式引用,只要线程是活动原创 2021-04-19 22:41:55 · 259 阅读 · 0 评论 -
订单付款倒计时实现方案
当使用 12306 抢票成功后,就会进入付款界面,这个时候就会出现一个订单倒计时,下面我们就对付款倒计时的功能实现,进行深入学习和介绍,界面展示如下:[外链图片转存失败,源站可能如何实现付款及时呢,首先用户下单后,存储用户的下单时间。下面介绍四种系统自动取消订单的方案:一、DelayQueue 延时无界阻塞队列我们的第一反应是用 数据库轮序+任务调度 来实现此功能。但这种高效率的延迟任务用任务调度(定时器)实现就得不偿失。而且对系统也是一种压力且数据库消耗极大。因此我们使用 Java 延迟队列.原创 2021-04-19 19:52:49 · 1648 阅读 · 1 评论 -
Nacos 配置中心的实现及原理
什么是 NacosNacos 是阿里发起的开源项目,地址:https://github.com/alibaba/nacos。Nacos 主要提供两种服务,一是配置中心,支持配置注册、变更下发、层级管理等,意义是不停机就可以动态刷新服务内部的配置项;二是作为命名服务,提供服务的注册和发现功能,通常用于在 RPC 框架的 Client 和 Server 中间充当媒介,还附带有健康监测、负载均衡等功能。本文聚焦于 Nacos 的第一块功能,即配置中心的实现。先叙述一个配置中心通常需要哪些组成部分,再结合 Na原创 2021-04-18 14:56:58 · 1952 阅读 · 0 评论 -
MySQL 中 explain关键字
explain关键字可以模拟优化器执行 SQL 查询语句,从而知道 MySQL 是如何处理 SQL 语句的。分析查询语句或表结构的性能瓶颈。执行语句:explain + SQL语句。表头信息如下:|一、ID 参数select 查询的序列号,包含一组数字,表示查询中执行 select 子句或操作表的顺序。三种情况:【1】**id 相同:**执行顺序由上而下;explain select t2.* from t1,t2,t3 where t1.id = t2.id and t1.id = t3..原创 2021-04-17 19:42:22 · 272 阅读 · 1 评论 -
MySQL 主从复制的问题及解决方案
复制功能是构建 MySQL 的大规模、高性能的基础,也就是所谓的 “水平扩展” 架构。我们可以通过为服务器配置一个或多个备库。同时,复制也是高可用性、可扩展性、灾难恢复、备份以及数据仓库等工作的基础。MySQL主从基本原理,主要形式以及主从同步延迟原理 (读写分离)导致主库从库数据不一致问题的及解决方案。一、复制概述复制解决的基本问题是让一台服务器的数据与其他服务器保持同步。一台主库的数据可以同步到多台备库上,备库本身也可以被配置成另外一台服务器的主库。通过复制可以将读操作指向备库来获得更好的读扩展,原创 2021-04-17 16:23:13 · 491 阅读 · 1 评论 -
Java 注解机制
注解是 JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。它主要的作用有以下四方面:**【1】生成文档:**通过代码里标识的元数据生成 javadoc文档。**【2】编译检查:**通过代码里标识的元数据让编译器在编译期间进行检查验证。**【3】编译时动态处理:**编译时通过代码里标识的元数据动态处理,例如动态生成代码。**【4】运行时动态处理:**运行时通过代码里标识的元数据动态处理,例如使用反射注入实例。这么来说是比较抽象的,我们具体原创 2021-04-13 20:59:41 · 208 阅读 · 0 评论 -
Java 反射机制
反射(Reflection)被视为动态语言的关键,反射机制允许程序在执行期间借助于 Reflection API 取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。反射是一种功能强大且复杂的机制。使用它的主要人员是工具构造者,而不是应用程序员。如果仅对设计应用程序感兴趣,而对构造工具不感兴趣,就没有学习的必要。一、反射机制提供的功能(什么时候会用到反射)【1】在运行时判断任意一个对象所属的类。【2】在运行时构造任意一个类的对象。【3】在运行时判断任意一个类所具有的成员变量和方法。【.原创 2021-04-13 20:47:54 · 71 阅读 · 0 评论 -
Java开发人员犯的10大错误
一、将数组转换为ArrayList要将数组转换为ArrayList,开发人员通常会这样做:List<String> list = Arrays.asList(arr);Arrays.asList()将返回 ArrayList私有静态类的Arrays,而不是java.util.ArrayList类。该java.util.Arrays.ArrayList有set(),get(),contains()方法,但没有添加元素的任何方法,所以它的大小是固定的。要创建一个real ArrayList原创 2021-04-13 20:42:47 · 75 阅读 · 0 评论 -
Redlock(redis分布式锁)原理分析
Redlock(redis分布式锁)原理分析Redlock:全名叫做 Redis Distributed Lock;即使用redis实现的分布式锁;使用场景:多个服务间保证同一时刻同一时间段内同一用户只能有一个请求(防止关键业务出现并发攻击);官网文档地址如下:https://redis.io/topics/distlock这个锁的算法实现了多redis实例的情况,相对于单redis节点来说,优点在于 防止了 单节点故障造成整个服务停止运行的情况;并且在多节点中锁的设计,及多节点同时崩溃等各种意外情原创 2021-04-13 11:15:47 · 246 阅读 · 0 评论 -
Spring事务失效的8种原因
Spring事务失效的 8种原因1、数据库引擎不支持事务这里以 MySQL 为例,其 MyISAM 引擎是不支持事务操作的,InnoDB 才是支持事务的引擎,一般要支持事务都会使用 InnoDB。根据 MySQL 的官方文档:https://dev.mysql.com/doc/refman/5.5/en/storage-engine-setting.html从 MySQL 5.5.5 开始的默认存储引擎是:InnoDB,之前默认的都是:MyISAM,所以这点要值得注意,底层引擎不支持事务再怎么转载 2021-04-12 23:58:06 · 151 阅读 · 0 评论 -
2PC(两阶段提交)【XA 与 Seata方案】
一、概述2PC(two phase commit protocol,2PC)即两阶段提交协议,是将整个事务流程分为两个阶段,准备阶段(Prepare phase)、提交阶段(Commit phase),2指两个阶段,P指准备阶段,C指提交阶段。整个事务过程由事务管理器和参与者组成,事务管理器负责决策整个分布式事务的提交和回滚,事务参与者负责自己本地事务的提交和回滚。在计算机中部分关系数据库如 Oracle、MySQL 都支持两阶段提交协议。下面是计算机数据库进行两阶段提交的说明:【1】准备阶段(Pre原创 2021-04-11 23:29:25 · 663 阅读 · 0 评论 -
Zookeeper Leader选举
Zookeeper Leader选举Leader选举是保证分布式数据一致性的关键所在。当 Zookeeper集群中的一台服务器出现以下两种情况之一时,需要进入 Leader选举:【1】服务器初始化启动;【2】服务器运行期间无法和 Leader保持连接;服务器启动时期的 Leader选举若进行 Leader选举,则至少需要二台机器,这里选取三台机器组成的服务器集群为例。在集群初始化阶段,当有一台服务器 Server1启动时,其单独无法进行和完成 Leader选举,当第二台服务器 Server2启动原创 2020-11-09 16:10:28 · 93 阅读 · 0 评论 -
线程池核心线程数参数配置
线程池参数配置1.根据list大小创建核心线程数 最大不超过5个int poolSize = Math.min(model.getXProductInfoList().size(), 5);2.写死new ThreadPoolExecutor(2, 3, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(10));CompletableFuture.runAsync(() -> asynProcessXProductRe原创 2021-04-01 23:17:48 · 1076 阅读 · 0 评论 -
java字符串反转的几种方式
方法一 调用StringBuffer中的reverse方法public static String reverse(String s) { return new StringBuffer(s).reverse().toString();}方法二:双指针class Solution { public void reverseString(char[] s) { int n = s.length; for (int left = 0, right =原创 2021-04-01 20:34:53 · 113 阅读 · 0 评论 -
Spring Cloud-Feign设计原理
Spring Cloud-Feign设计原理2019-05-25阅读 1.4K0 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://louluan.blog.csdn.net/article/details/82821294什么是Feign?Feign 的英文表意为“假装,伪装,变形”, 是一个http请求调用的轻量级框架,可以以Java接口注解的方式调用Http请求,而不用像Java中通过封装HTTP请求报文的转载 2021-03-25 23:43:18 · 212 阅读 · 0 评论 -
基于redis实现分布式锁(SETNX和Redisson)(以扣减库存来当作案例)
一:实现原理:利用redis中的set命令来实现分布式锁。从Redis 2.6.12版本开始,set可以使用下列参数:SET KEY VALUE [EX seconds] [PX milliseconds] [NX|XX]EX second :设置键的过期时间为second秒。 SET key value EX second效果等同于SETEX key second value 。PX millisecond :设置键的过期时间为millisecond毫秒。 SET key value PX mi转载 2021-03-22 23:23:50 · 1540 阅读 · 0 评论 -
apollo 与 nacos 功能对比
apollo与nacos 都为目前比较流行且维护活跃的2个配置中心,笔者对nacos(1.1.4版本)与 apollo(2020.1月更新源码部署)版本从几个方面进行了详细的对比。一:界面对比在界面上对2个对比,个人感觉2者都差不多,nacos可能看起来比较简洁,直接把所有项目和配置都直接展示出来了,但是apollo再项目划分概念上就比较清晰,进入后首先需要选择项目,选择项目后跳转才可以看到里面的配置,在配置上与nacos不同,apollo将每个配置项都分开解析出来了,每个配置项都有单独的发布和未发转载 2021-03-22 22:50:24 · 8305 阅读 · 0 评论 -
redis集群-主从同步、哨兵模式、Cluster 集群
集群的三种模式:一、主从同步/复制redis有俩种复制模式:Rdb和aofredis持久化问题;会有数据损失吗,开启aof的持久化吗;redis提供2种持久化方案。rdb和aofredis有自己默认的持久化方案 (Rdb 方案)Rdb(默认):在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之...原创 2020-04-06 19:43:14 · 5744 阅读 · 0 评论 -
Sentinel 对比 Hystrix
先来看一下 Hystrix 的官方介绍:Hystrix is a library that helps you control the interactions between these distributed services by adding latency tolerance and fault tolerance logic. Hystrix does this by isola...原创 2020-04-16 00:21:58 · 431 阅读 · 0 评论 -
Sentinel 流量控制
一、Sentinel 介绍Sentinel 是阿里巴巴出品的面向分布式服务架构的轻量级流量控制组件,主要以流量为切入点,从限流,流量整形、熔断降级、系统负载保护等多个维度来保障微服务的稳定性。主页地址SentinelHystrixresilience4j隔离策略信号量隔离(并发线程隔离)链接线程池隔离/信号量隔离信号量隔离熔断降级策略基于响应时间、异常比率、异常数基于异常比率基于异常比率、响应时间实时统计实现滑动窗口滑动窗口Ring Bit Buf原创 2021-03-21 15:36:57 · 476 阅读 · 0 评论 -
java面试---IO与NIO
一、概念 NIO即New IO,这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。二、NIO和IO的主要区别下表总结了Java IO和NIO之间的主要区别: IO NI...原创 2020-04-13 23:09:49 · 224 阅读 · 0 评论 -
java面试---String
1、什么是String,它是什么数据类型?String是定义在 java.lang 包下的一个类。它不是基本数据类型。String是不可变的,JVM使用字符串池来存储所有的字符串对象。2、创建String对象的不同方式有哪些? 和使用其他类一样通过new关键字来创建。 使用这种方式时,JVM创建字符串对象但不存储于字符串池。我们可以调用intern()方法将该字符串对象存储在...原创 2020-04-13 22:11:13 · 155 阅读 · 0 评论 -
java面试---servlet+jsp
1、说一说Servlet生命周期Servlet的生命周期分为三部分初始化:Web容器加载servlet,调用init()方法进行初始化。处理请求:当请求到达时,运行其service()方法。Service()会根据表单的请求类型调用相对doGet()方法或者是doPost()方法。销毁:当服务器关闭时,调用distroy()方法销毁servlet。2、get提交和post提交有...转载 2020-04-12 23:25:36 · 143 阅读 · 0 评论 -
Java面试---MyBatis
一、MyBatis 与 JDBC 的区别【1】JDBC 是 Java 提供操作数据库的 API;MyBatis 是一个持久层 ORM 框架,底层是对 JDBC 的封装。【2】使用 JDBC 需要连接数据库,注册驱动和数据库信息工作量大,每次都要去创建、关闭、获取JDBC 编程可能的异常进行捕获处理,并正确关闭资源对象关闭映射(ORM)。操作 Connection,打开 Statement 对...原创 2020-04-12 22:54:57 · 143 阅读 · 0 评论 -
Nginx 负载均衡算法有哪些
1.轮询(round robin)(默认)轮询方式,依次将请求分配到各个后台服务器中,默认的负载均衡方式。适用于后台机器性能一致的情况。挂掉的机器可以自动从服务列表中剔除。2.加权(weight)根据权重来分发请求到不同的机器中,指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 例如:upstream bakend { serv...转载 2020-04-11 21:50:07 · 756 阅读 · 0 评论