丰巢面试真题讲解系列-NO2

226 篇文章 0 订阅
119 篇文章 0 订阅

一.线程池的参数配置,为什么java官⽅提供⼯⼚⽅法给线程池

1、线程池简介:

2、核⼼参数:

3、⼯⼚⽅法作⽤:ThreadPoolExecutor类就是Executor的实现类,但ThreadPoolExecutor在使⽤上并不是那么⽅便,在实例化时需要传⼊很多歌参数,还要考虑线程的并发数等与线程池运⾏效率有关的参数,所以官⽅建议使⽤Executors⼯程类来创建线程池对象。

二.分布式框架dubbo的好处,不⽤dubbo可不可以。为什么要使⽤分布式

1、dubbo好处:

1、远程通讯: 提供对多种基于⻓连接的NIO框架抽象封装, 包括多种线程模型,序列化,以及“请求-响应”模式的信息交换⽅式。

2、软负载均衡及容错机制: 提供基于接⼝⽅法的透明远程过程调⽤,包括多协议⽀持,以及软负载均衡,失败容错,地址路由,动态配置等集群⽀持。

可在内⽹替代F5等硬件负载均衡器,降低成本,减少单点。

3、服务⾃动注册与发现: 基于注册中⼼⽬录服务,使服务消费⽅能动态的查找服务提供⽅,使地址透明,使服务提供⽅可以平滑增加或减少机器 。

4、提供完善的管理控制台dubbo-admin与简单的控制中⼼dubbo-monitor

5、Dubbo提供了伸缩性很好的插件模型,很⽅便进⾏扩展(ExtensionLoader)

2、不⽤dubbo可不可以:可以,使⽤springcloud。

3、分布式作⽤:

a. 系统之间的耦合度⼤⼤降低,可以独⽴开发、独⽴部署、独⽴测试,系统与系统之间的边界⾮常明确,排错也变得相当容易,开发效率⼤⼤提升。

b. 系统之间的耦合度降低,从⽽系统更易于扩展。我们可以针对性地扩展某些服务。假设这个商城要搞⼀次⼤促,下单量可能会⼤⼤提升,因此我们可以针对性地提升订单系统、产品系统的节点数量,⽽对于后台管理系统、数据分析系统⽽⾔,节点数量维持原有⽔平即可。

c. 服务的复⽤性更⾼。⽐如,当我们将⽤户系统作为单独的服务后,该公司所有的产品都可以使⽤该系统作为⽤户系统,⽆需重复开发。

三.七个垃圾回收器之间如何搭配使⽤

1. Serial New收集器是针对新⽣代的收集器,采⽤的是复制算法;

2. Parallel New(并⾏)收集器,新⽣代采⽤复制算法,⽼年代采⽤标记整理;

3. Parallel Scavenge(并⾏)收集器,针对新⽣代,采⽤复制收集算法;

4. Serial Old(串⾏)收集器,新⽣代采⽤复制,⽼年代采⽤标记清理;

5. Parallel Old(并⾏)收集器,针对⽼年代,标记整理;

6. CMS收集器,基于标记清理;

7. G1收集器(JDK):整体上是基于标记清理,局部采⽤复制;

综上:新⽣代基本采⽤复制算法,⽼年代采⽤标记整理算法。cms采⽤标记清理;

四.接⼝限流⽅案

1. 限制 总并发数(⽐如 数据库连接池、线程池)

2. 限制 瞬时并发数(如 nginx 的 limit_conn 模块,⽤来限制 瞬时并发连接数)

3. 限制 时间窗⼝内的平均速率(如 Guava 的 RateLimiter、nginx 的 limit_req 模块,限制每秒的平均速率)

4. 限制 远程接⼝ 调⽤速率

5. 限制 MQ 的消费速率

6. 可以根据 ⽹络连接数、⽹络流量、CPU 或 内存负载 等来限流

五.ConcurrentHashMap使⽤原理

1、⼯作机制(分⽚思想):它引⼊了⼀个“分段锁”的概念,具体可以理解为把⼀个⼤的Map拆分成N个⼩的segment,根据key.hashCode()来决定把key放到哪个HashTable中。可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。

2、应⽤:当读>写时使⽤,适合做缓存,在程序启动时初始化,之后可以被多个线程访问;

3、hash冲突:

1、简介:HashMap中调⽤hashCode()⽅法来计算hashCode。由于在Java中两个不同的对象可能有⼀样的hashCode,所以不同的键可能有⼀样hashCode,从⽽导致冲突的产⽣。

2、hash冲突解决:使⽤平衡树来代替链表,当同⼀hash中的元素数量超过特定的值便会由链表切换到平衡树

4、⽆锁读:ConcurrentHashMap之所以有较好的并发性是因为ConcurrentHashMap是⽆锁读和加锁写,并且利⽤了分段锁(不是在所有的entry上加锁,⽽是在⼀部分entry上加锁);

另一种回答:

ConcurrentHashMap是Java集合框架中提供的一个线程安全的哈希表实现,它允许并发读写操作,并提供了比传统的HashMap更高的并发性能。以下是ConcurrentHashMap的主要使用原理:

  1. 分段锁机制:ConcurrentHashMap内部将整个哈希表分为多个段(Segment),每个段实际上是一个独立的哈希表,并有一个独立的锁与之对应。这样,当多个线程访问ConcurrentHashMap时,它们可以并行地操作不同的段而不会相互阻塞。这种设计显著减少了锁竞争,提高了并发性能。每个线程可以持有不同段的锁,从而实现真正的并发访问。
  2. 哈希函数与分段:ConcurrentHashMap使用哈希函数来确定一个键值对应该存放在哪个分段中。哈希函数会根据键来计算一个哈希码,然后将哈希码与分段数量取模,以确定应该存放在哪个分段中。这种机制确保了键值对能够均匀分布到各个分段中,进一步提高了并发性能。
  3. CAS操作和synchronized:为了进一步提高性能,ConcurrentHashMap在JDK 1.8之后采用CAS(Compare-and-Swap)操作来减少锁的使用。CAS操作可以在多线程环境下实现无锁的数据修改,减少了锁的争用,提高了并发度。此外,它仍然在某些情况下使用synchronized关键字来保证线程安全。
  4. 红黑树优化:在JDK 1.8中,ConcurrentHashMap引入了红黑树来处理哈希冲突严重的情况。当某个分段的链表长度超过一定阈值时,链表会转换为红黑树,以提高搜索性能。这种优化使得ConcurrentHashMap在处理大量数据时能够保持较高的性能。
  5. 扩容机制:ConcurrentHashMap在扩容时只需对部分Segment进行扩容,而不是整体扩容。这样可以减小锁的粒度,减少并发冲突的概率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

纵然间

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

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

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

打赏作者

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

抵扣说明:

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

余额充值