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