Java温故而知新

1.什么是死锁?

image-20231026011030344
  • 我会从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。当然啊 我们可以主动选择捕获异常,出现这些异常的时候 虽然说无法通过捕获异常来实现异常的恢复,但是这些异常信息可以帮助我们快速去定位问题。

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这样的技术生态,可以让我们快速我们在落地微服务的解决方案,可以使我们在开发微服务的时候,快速去解决一些微服务的问题,不需要去考虑第三方技术集成带来额外成本,只要通过一些简单的配置组件,可以完成我们在微服务架构下落地的一些技术问题,从而可以让我们更加关注在代码层面,关注在业务的实现层面。

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 的索引性能比红黑树要好很多
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈卓410

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值