保存成功
订阅成功
保存失败,请重试
提交成功
Swagger

Swagger

高级开发工程师
资深开发工程师,目前在某大型互联网公司从事电商广告相关的开发设计工作,在互联网行业从事 Java 开发工作多年,在大型系统设计、广告系统架构及广告领域开发有丰富的实战经验,喜欢探究技术本质,热衷技术分享。...更多
创作文章11

RocketMQ 面试精选系列下:高阶问题及原理解析

在互联网中面试一些高端的职位时,对所应用到的技术绝不仅仅局限于使用和基本原理,在使用上碰到问题能快速定位和解决已经是基本的要求。针对 RocketMQ 同样如此,如果面试官感兴趣的话,问的问题会非常深入,而且不仅在技术深度上要考察,通常会有从一个问题延展到其他方面的连环问,这也是在考察候选人的技术广度。 所以针对 RocketMQ 的一些高阶问题,一定要做到深入和详尽,一但深入某个问题,这个问题涉及到的方方面面都有了解。如 RocketMQ 高性能的零拷贝,那么会有零拷贝是什么,具体是如何实现的这样的问题,这时如果简单的理解为少了内存间的复制是远远不够的,面试官期望更全面彻底的回答这个问题,而不是一笔带过。又或者在幂等时极有可能会涉及分布式唯一ID的问题,那么自然会延伸到业内通用的做法或一些开源的组件的实现,而这里这里不能有任何盲点。当然,只要我们提前将各个问题及背后的原理了解透彻就足以应对,而且多数时无需深入源码,在一些关键点清楚其实现逻辑即可。 本 Chat 作为《RocketMQ 面试精选系列》的下半部,精选了面试中 RocketMQ 一些高阶的问题,对每个问题进行深度分析和讲解,同时对一些问题可能引申出的其他技术问题,也做到透彻的讲解。通过阅读本 Chat,在对 RocketMQ 本身有了深入的理解同时,在面试中遇到 RocketMQ 延展的其他问题也能自信回答。 在 Chat 中会讲解下半部分:高阶问题及原理解析,主要精选如下几个问题: - 顺序消息用过吗,具体如何实现 - 生产端消费端实现顺序消息 - 顺序消息实现原理 - 消费端的基本原理是什么 - 消息获取是 push 还是 pull - 消费端 Rebalance - 如何保证消息的可靠性或高可用 - 发送端高可用 - broker 高可用 - 消费端高可用 - RocketMQ 高性能原因有哪些 - 高性能的几点原因 - 零拷贝的实现原理是什么 - 消息发生大量堆积应该怎样处理 - 消息去重或幂等用什么方案 - 数据库自增模式 - 号段模式及滴滴 Tinyid - 雪花算法 - 百度 Uid-Generator 和美团 Leaf
RocketMQ
61 订阅

RocketMQ 面试精选系列上:基础问题总结及解析

近年来 RocketMQ 凭借其优异的性能,在互联网公司中应用的非常广泛,更成为面试的重点。中间件的面试不同于 Java 本身,身为 Java 开发人员对 JDK 中的部分源码是需要一定了解的,而对于中间件而言,其要求却不同。中间件更注重的是使用和实践,它是用来解决实际的问题,因此往往从原理和实践两方面考察候选人,了解其原理也是为了在实践中出现问题能快速定位和解决。 RocketMQ 在涉及到高并发、大流量的问题都充当着重要的角色,没有消息中间件的话互联网应用的技术架构会遇到很多瓶颈。在面试中也不乏很多候选人用了 RocketMQ,然后问到深入使用或原理性的问题却无法答出,如幂等性的问题,会有部分候选人能回到出查库来实现幂能,如果数据量大呢?那么分库分表、redis 缓存、布隆过滤器这些方案都应在考虑在内。因此对于 RocketMQ 不能局限于使用,还是需要对其底层的一些通用且有深度的技术和方案进行了解。 本 Chat 作为《RocketMQ 面试精选系列》第一部分,精选了面试中 RocketMQ 一些基础问题,由浅入深从实际的面试问题的角度出发,对每个问题进行深度分析和讲解,通过阅读本 Chat 可以高效的准备面试并且让消息队列成为你的重要技术栈。 在 Chat 中会讲解第一部分:基础问题总结及解析,主要精选如下几个问题: - 为什么使用消息队列,怎么做的这个技术选型 - 消息队列有哪些使用场景 - 除了 RocketMQ,常见的 Kafka、RabbitMQ 了解过吗 - RocketMQ 有哪几种角色,如何交互的 - RocketMQ 消息发送方式有哪三种,分别应用在什么场景 - 在使用 RocketMQ 时如何实现消息幂等
RocketMQ
63 订阅

Java 并发面试系列九:并发中同步工具的使用及原理

在大厂的并发面试中,CountDownLatch、CyclicBarrier、Semaphore 这三个同步工具被问到的频率非常的高,其基本要求是能正确回答出其功能和应用场景,如果这个基本要求没有达到,面试通过的几率就很小了。这三个同步工具在 JDK5 中就已经引入,其使用场景清晰且使用起来不复杂,因此也非常适合现场考核候选人写出具体的使用代码,所有我们要对它们的使用非常熟悉,当然若能了解其实现原理将会是加分项。 在 JDK 7 中引入了 Phaser,它可以代替代 CountDownLatch 和 CyclicBarrier,并且其引入的新特性使其功能更加强大。对 Phaser 的使用和了解可直接作为候选人的加分项。关于同步工具的面试问题不难回答,关键要认真的学习过。本 Chat 作为《 Java 并发面试系列》第九章, 将会对三个基本同步工具的应用场景及原理进行深入讲解,同时也会对 Phaser 进行介绍,让你彻底掌握关于同步工具这一高频面试问题。 在 Chat 中你将学习到: - CountDownLatch 用在什么场景 - 应用 CountDownLatch 和 join 有何区别 - CountDownLatch 的原理是什么 - CyclicBarrier 用在什么场景 - CyclicBarrier 的原理是什么 - CyclicBarrier 和 CountDownLatch 对比有何差异 - Semaphore 用在什么场景 - Semaphore 的原理是什么 - 如何用 Phaser 替代传统的同步工具 - Phaser 有哪些新特性
Java
109 订阅

Java 并发面试系列八:并发中的异步处理机制

异步处理在并发编程中占有非常重要的地位,尤其是 Java8 中引入了强大的异步编程工具 CompletableFuture。在 Java8 之前,Guava 已经有相比于 JDK 完善的方案,但 Java8 突破性的引入函数式编程后,λ 表达式极大简化了代码的书写,而异步处理工具 CompletableFuture、流处理等都是基于函数式编程的最佳实践。 关于并发的异步处理机制不止是在面试中,在工作中更是会多处使用,因此每个人都需要完整的学习一次,不然会出现开发了多年的 Java,别人用 Java8 写的链式异步处理代码自己完全看不懂的窘境。本 chat 从原始的异步任务处理开始介绍,逐步深入到 CompletableFuture 的使用,同时列举多个使用场景,让你彻底掌握 Java 中的异步处理机制。 在 Chat 中你将学习到: - Java 中的 FutureTask 原理是什么 - FutureTask 有什么问题 - Guava 解决异步的思路是什么 - CompletableFuture 是什么 - CompletableFuture 的简单使用 - 编程利器-CompletableFuture 的异步任务链 - CompletableFuture 的组合处理 - CompletableFuture 内部原理介绍
Java
149 订阅

Java 并发面试系列七:线程池的工作原理

线程池在日常开发中使用频率非常高,JDK 提供的线程池解决方案作为处理并发的基础手段,已经足够完善和优秀。正因为如此,在近年大厂面试当中,线程池的工作原理更是作为并发的基础问题来考察候选人,要求候选人对线程池的工作原理、7参构造函数、拒绝策略有清晰的记忆和理解,否则很容易被淘汰。 在一些中间件岗位的开发中,就不仅要求了解线程池的基本原理,同时还要深入线程池的内部实现及一些比较偏的点,如要了解线程池的状态、线程池优雅关闭的实现、任务的提交过程、任务的执行过程、synchronousQueue 的应用等等,这些在日常的业务开发中是无需关注或较少使用的,但要在框架和中间件中使用线程池则要做到门清。 本 Chat 作为《Java 并发面试系列》第七章,会深入的分析线程池的用法和实现,无论是面试中的线程池问题,或是日常普通的业务开发,亦或是针对框架及中间件的开发,本 Chat 都能让你从中受益。 在 Chat 中你将学习到: - 为什么要使用线程池 - 线程池的七参构造函数是什么,每个参数有什么含义 - 线程池的工作原理是什么 - 线程池的拒绝策略有哪些 - 线程的状态有哪些,如何转换的 - 线程池的状态有哪些 - 线程池使用的时候如何正确关闭 - 线程池如何实现的优雅关闭 - 阿里巴巴开发规范对线程池的建议是什么,为什么要这样做
Java
113 订阅

Java 并发面试系列六:ThreadLocal 机制-线程本地变量

在面试中如果出现了 ThreadLocal 的问题,多数是因为候选人在简历项目中有提及。从面试官的经验来看,大多数候选人能回答出大致作用和原理,但深入到 ThreadLocal 的设计、内存泄漏、弱引用等问题,能清楚解答的并不多,有许多人甚至不知道 ThreadLocal 会导致内存泄漏问题。当然回答中若能提及 Netty 的 FastThreadLocal 和阿里开源的 TransmittableThreadLocal 等一些问题对面试官来说是意外的惊喜。若在简历中有写到用了 ThreadLocal 但却对它了解不够深入,无异于是给自己挖了坑。 如果你在日常用到了 ThreadLocal 或在简历项目中写到,那么一定要清楚它的原理及问题。不仅如此,ThreadLocal 思想也会衍生出 JDK 中的 InheritableThreadLocal、ThreadLocalRandom 等一些类,你知道它们的原理吗?从实践的角度,Netty 中提供了 FastThreadLocal,它和 JDK 中 ThreadLocal 有什么区别?阿里的 TransmittableThreadLocal 如何使用?其实 ThreadLocal 面试的问题并不难,本 Chat 作为《 Java 并发面试系列》第六章, 将会对 ThreadLocal 进行深入讲解,包括 ThreadLocal 的设计原理和内存泄漏问题,同时也会对 JDK 中的 InheritableThreadLocal、ThreadLocalRandom、Netty 中的 FastThreadLocal、阿里的 TransmittableThreadLocal 进行分析,让你彻底掌握关于 ThreadLocal 的相关问题。 在 Chat 中你将学习到: - ThreadLocal 是什么,如何使用 - ThreadLocal 的设计原理是什么 - ThreadLocal 的内存泄漏问题 - InheritableThreadLocal 的原理和使用场景是什么 - Random 类有哪些问题 - ThreadLocalRandom 的作用是什么 - Netty 的 FastThreadLocal 与 JDK 的 ThreadLocal 有何异同 - 阿里的 TransmittableThreadLocal 如何使用
Java
121 订阅

Java 并发面试系列五:彻底掌握显式锁 ReentrantLock 原理

ReentrantLock 显式锁可以认为是 Java 锁技术的一个里程碑,它适合复杂的并发场景,其重要性不言而喻。在大厂的招聘中,ReentrantLock 通常用来考察求职者对并发锁的实践情况,但在面试中仍然有的面试者出现未释放锁或不在 finally 中释放锁的情况,这在面试官眼里会被认为基础不扎实甚至对显示锁毫无了解进而被淘汰。 显示锁 ReentrantLock 不同于 Synchronized 隐式锁,Synchronized 锁细节都由虚拟机控制,而 ReentrantLock 存在 JDK 并发包中用 Java 语言来实现,因此关于 ReentrantLock 的一些问题可以有更确定的答案。关于 Synchronized 的原理,在面试中一般在能正确使用的基础上被当作知识面广度来考察,而 ReentrantLock 很多实现细节是确定的,关于它的实现有更多的问题值得探讨。当然,如果对 Synchronized 原理和 ReentrantLock 都能有深入了解,绝对会让面试官眼前一亮。本 Chat 作为《Java 并发面试系列》第五章,也是关于锁的最后一章,会深入的分析 ReentrantLock 的用法和实现,同时会对并发包中的其它锁原理进行讲解。 在 Chat 中你将学习到: - ReentrantLock 是什么 - ReentrantLock 的基本用法及注意事项 - ReentrantLock 类的内部结构是怎么样的 - Java 中如何实现线程的挂起和唤醒 - AQS 的整体架构是怎么样的 - ReentrantLock 的整体执行逻辑是什么 - 锁的获取流程 - 锁的释放流程 - 公平锁和非公平锁区别是什么,体现在哪 - Condition 的实现原理及与 wait、notify 有何异同 - ReentrantLock 的整体设计和 Synchronized 的对比有何异同 - 读写锁 ReentrantReadWriteLock 的原理 - StampLock 的原理
Java
125 订阅

Java 并发面试系列四:synchronized 隐式锁的底层原理

synchronized 关键字作为 Java 中最基本的同步手段,关于其原理一直是面试或工作中都绕不开话题。尽管 synchronized 被认为是重量级锁,但作为并发中最有效的互斥手段且不断的进行优化,以至后来的乐观锁 CAS、显示锁 ReentrantLock 都不能撼动其核心地位。另外,synchronized 关键字 与 volatile 关键字一样,其背后隐藏的原理都比较复杂,并且它的应用要比 volatile 广泛的多,其重要性不言而喻。通常 volatile 是面试中的加分项,而 synchronized 则是基础项。 如果对 synchronized 理解或使用不当,在开发中极易造成线上事故,这也是 synchronized 成为面试中最基本考察点的一个原因。正确的理解并掌握 synchronized 关键字原理是进入并发编程领域必须攻克的难关。本 Chat 作为《Java 并发面试系列》第四章,会深入的去剖析 synchronized 关键字及其背后的原理。 在 Chat 中你将学习到: - 什么是 synchronized 及互斥锁怎么理解 - synchronized 的基本使用方式有哪几种 - 使用 synchronized 加锁时,锁的到底是什么 - synchronized 死锁是怎么造成的,该如何避免 - synchronized 锁被忽视的点:可见性和有序性 - synchronized 背后的实现原理是什么 - 为什么操作系统需要从用户态内核态切换 - 什么是 Synchronized 锁消除 - 什么是 Synchronized 锁粗化 - 什么是自适应自旋 - 如何理解偏向锁 - 如何理解轻量级锁及锁升级过程
Java
108 订阅

Java 并发面试系列三:CAS 乐观锁与悲观锁

CAS 是实现 Java 并发包的基石,如果没有它,Java 并发包中众多功能的实现类都无从谈起。同时 CAS 背后更代表了一种非常重要的思想-乐观锁,这种思想在互联网技术中的运用十分常见,如 MySQL 的多版本并发控制、Redis、分布式锁的实现等都可以看到乐观锁的影子。在 Java 的并发包 java.util.concurrent.atomic 中,更是提供了诸多基于 CAS 实现的原子操作类。本 Chat 作为《Java 并发面试系列》第三章,会深入的讲解 CAS 原理和相关问题,同时也会详细的分析并发包中的原子操作类的实现。 在 Chat 中你将学到: - CAS 是什么 - 什么是乐观锁和悲观锁 - CAS 有哪些问题 - CAS 中如何解决 ABA 问题 - JDK 源码中对 CAS 是如何使用和实现的 - 并发包中原子操作类的实现原理是什么 - ABA 问题的终结者 - AtomicStampedReference - AtomicFieldUpdater 的作用及原理 - 数组的原子操作实现原理是什么 - LongAdder 的作用及实现原理是什么
Java高并发
149 订阅

Java 并发面试系列二:彻底掌握 volatile 关键字原理

volatile 关键字在互联网面试中出现频的率非常高,除了 volatile 关键字在日常开发中使用较多之外,另一个主要原因是它使用足够简单,并且它的原理足够复杂,面试官很喜欢以 volatile 关键字作为切入点来考察并发问题。 volatile 关键字背后原理远没有它看起来那样”简单轻量“,因为其背后涉及到 JVM 的实现及操作系统的知识,这些包括 Java 内存模型(JMM)、重排序、可见性、内存屏障、高速缓存、缓存一致性、CPU缓存体系、硬件缓冲区、as-if-serial 语义、happens-before 规则等,只有将这里的每一项都清晰的理解,才能真正的理解volatie关键字。将上述这些完全掌握绝非易事,而那些真正掌握 volatile 关键字原理的人则会在面试中更受青睐。本 Chat 作为《Java 并发面试系列》第二章,会逐步剖析讲解 volatile 关键字的底层原理,让你彻底理解和掌握 volatile 关键字。 在 Chat 中你将学习到: - 什么是 volatile 关键字 - 什么是线程可见性 - 理解 CPU 缓存体系及缓存一致性协议 - 写缓冲和无效化队列与可见性的关系 - 什么是重排序,重排序出现的原因 - DCL 单例模式有什么问题,为什么要用 volatile - 如何理解内存屏障 - 如何理解 Java 内存模型 - as-if-serial 语义及 happens-before 规则如何理解 - Volatile 是如何保证可见性和重排序的 - Volatile 的原子性问题 - Volatile 用在哪个地方或哪些场景
Java
140 订阅

Java 并发面试系列一:并发编程基础

并发编程一直作为大厂考察一名 Java 开发工程师的核心指标,Java 并发通常作为互联网中高并应用设计中的基础模块,掌握和理解并发的底层原理无论在工作中或面试中都大有裨益。日常开发工作中,很多人在一些业务编码的时候不会接触到高并发,即便用了很多框架也做了线程与线程之间的隔离和划分或在底层屏蔽了并发的实现,但当要开发一些基础的底层组件时,并发编程一定是核心的难点。 ​近年来在大厂的面试中,高并发不但占比较多,而且已经不局限于并发工具的使用,更多的会深入到底的层实现原理,这样能考察候程序员的内功,看其是否能知其所以然。如何能在面试时遇到高并发问题时游刃有余呢,本 Chat 总结面试中常见的并发问题进行精讲,每个问题的解答都会用清晰的语言描述出来、讲清楚、讲透。读者在对每个知识点的广度和深度充分理解后,可以完善并发知识体系并在面试中做到胸有成竹。 在 Chat 中,会讲解第一部分:并发编程基础,主要涉及以下几个问题: - Java 中线程有多种创建方式,其本质是什么? - 守护线程是什么,有什么用处? - 如何理解线程的中断? - 用 wait() 和 notify() 实现的生产者消费者有什么问题,如何解决? - Condition 如何实现生产者-消费者模式?
Java
178 订阅