java-面试题-杂篇

1、分布锁的实现方式

参考:分布式锁的三种实现方式

           干货 | 分布式锁的几种实现

           分布式锁4种实现方式的比较

          从认知到实现,一文读懂实现分布式锁的五种方案。

2、什么时候使用volatile

参考:Java 面试宝典:volatile 的使用场景有哪些?

3、Hashmap和ConcurrentHashMap底层实现原理

1. HashMap

HashMap 是 Java 中的一个非同步的散列映射表,它使用一个数组来存储键值对,并且通过计算键的哈希码来确定每个键值对在数组中的位置。

底层实现原理:

数组: HashMap 内部使用一个长度为 n 的数组来保存键值对,其中 n 是数组的容量(capacity)。

哈希函数: 对于每个键(key),HashMap 会调用其 hashCode() 方法,然后使用这个哈希码通过某种哈希算法(例如取模运算)来计算数组中的索引。

链表/红黑树: 如果两个键通过哈希函数得到的索引相同,这两个键值对会被存储在同一个数组槽位上。为了解决这个问题,HashMap 使用链表(或在 Java 8 之后,当链表长度超过一定阈值时,转换为红黑树)来解决冲突。

扩容机制:

当 HashMap 中的元素数量超过其容量(即数组长度)的负载因子(默认是0.75)时,它会自动扩容,通常是原来的两倍。

扩容时会重新计算每个元素的哈希码并重新放置到新的数组位置上。

2. ConcurrentHashMap

ConcurrentHashMap 是 Java 中的一个线程安全的散列映射表,它允许多个线程同时进行读写操作而不会引起数据不一致的问题。

底层实现原理:

分段锁(Segment): 在 Java 8 之前,ConcurrentHashMap 使用分段锁(Segment)的概念来实现线程安全。每个 Segment 都是一个小的 HashMap,并且可以被不同的线程独立地锁定。

CAS操作和synchronized: 在 Java 8 之后,ConcurrentHashMap 使用了一种更高效的方式:基于节点的无锁并发控制算法(如 CAS)和一些细粒度的锁(如 synchronized 或 Lock)。

Node节点: ConcurrentHashMap 中的每个元素都是一个 Node 对象,它包含了键、值、指向下一个节点的引用等信息。

扩容机制: 当元素数量达到扩容阈值时,ConcurrentHashMap 会进行扩容。扩容时,它会创建一个新的更大的数组,并使用一个线程来协助迁移旧数组中的元素到新数组中。

主要改进点:

减少锁的粒度:在 Java 8 中,通过将整个桶数组分割成多个小的桶(称为“段”或“桶”),每个桶可以独立地进行锁定和解锁操作,从而减少了锁的竞争。

使用CAS操作:在 Java 8 中,对于大多数操作(如插入、删除、查找),使用了 CAS 操作来避免使用锁,从而提高并发性能。

链表到红黑树的转换:当链表长度超过一定阈值时,会将链表转换为红黑树以提高搜索效率。

总结

HashMap 使用数组和链表(或红黑树)来解决哈希冲突,并通过扩容机制来处理容量不足的情况。

ConcurrentHashMap 在 Java 8 之前使用分段锁来实现线程安全;在 Java 8 中则通过节点级别的 CAS 操作和锁的精细控制来实现更高的并发性能。两者都通过哈希函数和适当的结构来解决哈希冲突。

4、如何解决缓存穿透和缓存雪崩

参考:Redis详解(十二)------ 缓存穿透、缓存击穿、缓存雪崩

          缓存穿透、缓存击穿、缓存雪崩的理解和解决方案[通俗易懂]

          Redis的缓存穿透、缓存雪崩、缓存击穿问题及有效解决方案

          Redis缓存穿透、击穿、雪崩介绍以及解决方案

5、垃圾回收机制

参考:【Java虚拟机】JVM垃圾回收机制和常见回收算法原理

6、kafka选型依据

参考:架构必备能力——kafka的选型对比及应用场景

           kafka篇-设计思路

          架构必备能力——kafka的选型对比及应用场景

          Kafka存取原理与实现分析,打破面试难关

         深入解析kafka高性能背后的实现原理

        消息中间件—简谈Kafka中的NIO网络通信模型

        聊聊 Kafka:Kafka 如何保证一致性

7、MySQL中有哪些锁类型

1. 全局锁

读锁(共享锁):阻止其他用户更新数据,但允许读取数据。常用于需要确保数据一致性的操作,如全库备份。可以通过FLUSH TABLES WITH READ LOCK(FTWRL)语句添加全局读锁,使用UNLOCK TABLES语句释放锁定12。

写锁(排他锁):阻止其他用户读取和更新数据。常用于大量数据修改操作,确保数据不被干扰12。

2. 表级锁

表锁:针对整张表进行加锁,适用于需要操作整张表的情况,如DDL操作或备份。表锁开销小、加锁快,但并发度低,容易出现锁冲突23。

3. 行级锁

行锁:针对数据表中的某一行进行加锁,减少锁冲突,提高并发性和系统吞吐量。InnoDB引擎支持行锁23。

间隙锁(Gap Lock):锁定一个范围,防止幻读。常用于外键约束和重复读操作4。

临键锁(Next-Key Lock):结合行锁和间隙锁,防止幻读和重复读4。

4. 页面锁

针对数据页进行加锁,适用于大批量数据的处理4。

5. 乐观锁与悲观锁

乐观锁:假设冲突发生的概率较低,通过版本号或时间戳来控制并发访问。适用于写操作不频繁的场景4

8、mysql 间隙锁和邻键锁区别以及适用场景

在MySQL中,锁的类型对于并发控制和数据一致性至关重要。间隙锁(Gap Locks)和邻键锁(Next-Key Locks)是InnoDB存储引擎用来处理行级锁的两种方式,特别是在执行范围查询时。这两种锁的设计主要是为了解决幻读(Phantom Reads)的问题。

间隙锁(Gap Locks)

间隙锁锁定的是一个范围,而不是具体的行。当一个事务对某个范围的数据加锁时,它阻止其他事务在这个范围内插入新的行。间隙锁主要用于防止幻读。例如,如果你有一个范围查询锁定了一个区间内的所有行,间隙锁会阻止在该区间内插入新行。

适用场景:

防止插入操作:当你需要确保在一定范围内没有新的行被插入时。

优化并发性能:在高并发环境下,通过锁定不需要的间隙可以减少锁的竞争。

邻键锁(Next-Key Locks)

邻键锁是间隙锁和行锁的结合。它不仅锁定一个范围(间隙),还包括这个范围内的所有行。这确保了既防止了在该范围内插入新行,也防止了其他事务修改或删除范围内的行。邻键锁用于实现可重复读(REPEATABLE READ)隔离级别,这是InnoDB的默认隔离级别。

适用场景:

可重复读隔离级别:在默认的隔离级别下,邻键锁用于确保事务在读取数据时,数据不会被其他事务修改。

防止幻读:在执行范围查询时,通过锁定查询涉及的所有行和间隙,防止其他事务插入新行到查询范围内,从而实现防止幻读。

区别

范围:间隙锁锁定的是两个行之间的空间(间隙),而邻键锁锁定的是具体的行以及该行之前的间隙。

目的:间隙锁主要用于防止新的插入操作,而邻键锁用于防止新的插入和修改/删除操作,同时防止幻读。

隔离级别:在可重复读隔离级别下,InnoDB使用邻键锁;而在读已提交(READ COMMITTED)隔离级别下,通常只使用行锁,不会使用间隙锁或邻键锁来防止幻读。

总结

使用间隙锁来防止在特定范围内插入新行。

使用邻键锁来实现可重复读隔离级别,防止幻读,包括锁定范围内的所有行和间隙。

选择使用哪种类型的锁取决于你的具体需求和隔离级别设置。在大多数情况下,尤其是在默认的隔离级别下,你不需要手动管理这些锁的类型;InnoDB会自动为你处理这些细节。然而,了解它们的区别和适用场景可以帮助你更好地理解事务的行为和性能调优。

参考:【MySQL】一文带你理清<行级锁>(行锁,间隙锁,临键锁

           「MySQL」MySQL中的锁

              MySQL锁、加锁机制(超详细)—— 锁分类、全局锁、共享锁、排他锁;表锁、元数据锁、意向锁;行锁、间隙锁、临键锁;乐观锁、悲观锁

9、springboot 慢接口如何排查

接口响应过慢的原因排查

10、抽奖活动的高可用、高并发优化

抽奖活动的高可用、高并发优化

JAVA巧用Redis中的原子性操作,解决秒杀并发中的问题,如商品一卖二

1 号店的抽奖系统架构实践(限流削峰到性能优化)

设计一个抽奖系统

从零构建高并发抽奖系统:Redis分布式锁的应用实例解析

如何设计一个百万级用户的抽奖系统?

百万抽奖系统设计架构入门

抽奖活动高并发架构 进行抽奖活动

从零构建高并发抽奖系统:Redis分布式锁的应用实例解析

1、设计一个抽奖系统         2、设计一个简易版的数据库路由

11、阿里云服务器 如何处理网站高并发流量问题?

阿里云服务器 如何处理网站高并发流量问题?

12、三高问题

高可用技术

高并发技术

阿里云服务器 如何处理网站高并发流量问题?(含教程

美团面试官:哟!你对高并发与多线程的解决思路了解的还挺深!

13、高并发下扣减库存

12306库存校验与扣减实现方案

如何解决高并发下的库存抢购超卖少买问题?【计算机】

一步一步,实现一个完美的高并发订单减库存方案

聊聊高并发下库存加减那些事儿——“异步扣减库存”

高并发场景下强一致预算/库存扣减方案

14、jemalloc分配机制的介绍及其优化实践

jemalloc分配机制的介绍及其优化实践

15、接口优化关注点

explain | 索引优化的这把绝世好剑,你真的会用吗?

聊聊sql优化的15个小技巧

让人头痛的大事务问题到底要如何解决?

聊聊redis分布式锁的8大坑

阿里二面:为什么要分库分表?

接口性能优化的11个小技巧

16、大数据常见面试

大数据常见面试题及答案(Linux、Zookeeper、Hadoop、Hive)

HDFS的SecondaryNameNode作用,你别答错

17、多个事务并发插入数据违反唯一性约束会导致死锁

面试官:MySQL 唯一索引为什么会导致死锁?

18、阿里巴巴、亚马逊、谷歌、京东等大公司是如何设计高并发秒杀系统

京东生产环境十万并发秒杀系统三高架构

架构师:如何设计一个秒杀系统?

高并发秒杀系统如何设计?

阿里的秒杀系统是怎么设计的?

【高并发解决方案】5、如何设计一个秒杀系统

【高并发】高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!

19、MQ集群崩溃时如何保证秒杀系统高可用

20、分布式服务强一致性算法

raft协议简介

28图图解Raft协议,so easy~~

Raft协议详解,分布式一致性的艺术

科普文:分布式数据一致性协议Paxos

聊聊 分布式一致性算法协议 Paxos

Raft协议详解,分布式一致性的艺术

22、kafka Rebalance协议

kafka知识点--offset管理和Consumer Rebalance

Kafka Consumer 消费消息和 Rebalance 机制

23、分布式事务

“TCC分布式事务”实现原理

终于有人把“TCC分布式事务”实现原理讲明白了!

seata分布式事务TCC模式的原理和使用

TCC 适用模型与适用场景分析

分布式事务中间件Seata的设计原理

Seata 分布式事务之 TCC 理论及设计实现

RocketMQ(2)---实现分布式事务原理

分布式事务(1)---2PC和3PC原理

seata的AT模式的执行流程

大牛----补偿事务模式

CAP 理论十二年回顾:"规则"变了

24、分库分表

Vitess VReplication的功能,设计

基于kubernetes集群的Vitess最佳实践

基于minikube的kubernetes集群部署

分库分表之初识Vitess

25、分布式事务框架seata

springBoot集成seata

亿级流量架构之分布式事务思路及方法

亿级流量架构之分布式事务解决方案对比

微服务分布式事务之LCN、TCC特点、事务补偿机制缘由以及设计重点

26、Redis拆分

Redis集群拆分原则之AKF

27、kafka事务消息

Kafka Exactly Once 语义实现原理:幂等性与事务消息

3. kafka事务消息

Kafka Exactly-Once 之事务性实现

28、kafka数据格式

Kafka消息(存储)格式及索引组织方式

29、kafka中的选举机制

Kafka科普系列 | 原来Kafka中的选举有这么多?

30、kafka为什么这么快

Kafka 为什么那么快?

31、RocketMQ原理

RocketMQ原理—RocketMQ整体运行原理

RocketMQ实战—8.营销系统业务和方案介绍

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容