1.什么是死锁?
- 我会从3个方面来回答:
- 什么是死锁
- 所谓死锁是一组互相竞争资源的线程因为互相等待造成“永久”阻塞的现象
- 发生锁的原因:
- 互斥条件。共享资源x、y只能被一个线程占用
- 占有且等待。线程t1已经取得了共享资源x,在等待共享资源y的时候,不释放共享资源x
- 不可抢占。其他线程不可强行去抢占线程t1占有的资源
- 循环等待。线程t1等待线程t2占有的资源,线程t2等待线程t1占有的资源
- 如何避免死锁(从上面4个原因入手)
- 互斥条件 无法改变,因为锁本身就是通过互斥来解决线程安全问题的,所以从后面3个原因入手
- 对于’‘占有且等待’',我们可以一次性申请所有的资源,这样就不存在等待了
- 对于’‘不可抢占’,占有部分资源的线程,进一步申请其他线程时,如果申请不到,可以主动释放它占有的资源;
- 对于"循环等待",可以按照顺序申请资源去进行预防,所谓的按顺序申请,是指资源是有线性顺序的,申请的时候可以先申请资源序号小的,再申请资源序号大的,这样线性化后自然就不存在循环等待了;
2. 什么是异常?
- 我会从2个方面来回答
- 第1个方面是异常的本质,受检异常和非受检异常都是派生自Throwable,它有2个子类实现 Error 和 Exception
- Error 是指程序无法处理的错误,只能事先避免,比如OutOfMemeryError内存溢出、StackOverflowError栈溢出,它和程序本身没有关系
- Exception 是指程序运行时候他需要处理的异常,受检异常和非受检异常都是派生自这个Exception
- 第2个对于受检异常和非受检异常的定义
- 受检异常(checked Excepton):或叫编译时异常,例如FileNotFoundException,IOException程序在编译阶段必须要主动捕获的异常,遇到这种异常的时候有2种处理方法
- 通过 try/catch 捕获
- 通过 throw 把异常抛出去
- 非受检异常:或叫运行时异常,程序不需要主动去捕获,一般发生在程序运行期间 比如NullPointException,RuntimeException。当然啊 我们可以主动选择捕获异常,出现这些异常的时候 虽然说无法通过捕获异常来实现异常的恢复,但是这些异常信息可以帮助我们快速去定位问题。
- 受检异常(checked Excepton):或叫编译时异常,例如FileNotFoundException,IOException程序在编译阶段必须要主动捕获的异常,遇到这种异常的时候有2种处理方法
3. 谈谈你对Spring Cloud的理解
-
Spring Cloud是一套分布式微服务的技术解决方案,它提供了快速构建分布式系统的常用的一些组件,比如说
- 配置管理
- 服务的注册与发现
- 服务调用的负载均衡
- 资源隔离、熔断降级等等
-
不过Spring Cloud 只是Spring官方提供的一套标准化的微服务定义,而真正的实现 目前有2套主流的方案
- 一个是Spring Cloud Netflix,它是基于Netflix这个公司的开源组件集成的一套微服务解决方案,其中包括像
- Ribbon 做负载均衡
- Hystrix 做服务熔断
- Zuul 网关
- Eureka 服务的注册与发现
- Feign 服务的调用
- 一个是Spring Cloud Alibaba ,它是基于Alibaba开源组件集成的微服务解决方案,目前算比较主流,包含的组件是
- Dubbo
- Nacos
- Seata
- Sentinel
有了Spring Cloud这样的技术生态,可以让我们快速我们在落地微服务的解决方案,可以使我们在开发微服务的时候,快速去解决一些微服务的问题,不需要去考虑第三方技术集成带来额外成本,只要通过一些简单的配置组件,可以完成我们在微服务架构下落地的一些技术问题,从而可以让我们更加关注在代码层面,关注在业务的实现层面。
- 一个是Spring Cloud Netflix,它是基于Netflix这个公司的开源组件集成的一套微服务解决方案,其中包括像
4.索引的底层实现
- 为什么选择B+树 而不是 红黑树
- 我主要从2个方面来回答
- 第1个,对于一个数据库来说,存储数据量比较多的情况下,会导致索引很大,因此需要将索引存储在磁盘,但是磁盘的 io 操作又非常低,所以提高索引效率的关键在于减少磁盘IO的次数,举个例子 对于31 个节点的树来说,一个5阶 b+tree 的高度是 3,一个红黑树的最小高度是 5;树的高度基本决定了磁盘的 io 次数,所以使用 b+tree 性能要高很多;
- 第2个,b+tree 有个特点是相邻的数据在物理上也是相邻的,因为 b+tree 的 node 的大小设为一个页,而一个节点上存有多个相邻的关键字和分支信息,每次我们去检索信息的时候,只需要一次IO就能完全载入相邻的信息和目标信息,相当于一次 IO 载入了多个相邻的关键字和分支;而红黑树不具备这个特征,红黑树中大小相邻的数据在物理结构上可能差距非常大,由于程序的局部性原理,我们在索引中采用了预加载的技术,每次磁盘访问的时候,除了去访问目标数据以外,我们还可以基手局部性原理加载几页相邻的数据到内存中,而这个加载是不需要消耗多余磁盘 io 的,因此 基于局部性原理以及 b+tree 存储结构物理上的特征,所以 b+tree 的索引性能比红黑树要好很多