跳至主要內容
九夏的博客

九夏的博客

个人成长记录

Java 并发面试题

Java中的volatile关键字有什么作用?

volatile关键字在Java中的作用包括:

  1. 保证可见性: 确保变量的修改对其他线程立即可见。
  2. 防止指令重排: 防止编译器对操作进行重排序,保证代码的执行顺序。
  3. 非原子性: volatile变量的单次读/写操作是原子的,但复合操作(如i++)不是原子的。

Java中的synchronized关键字及其工作原理。

synchronized关键字在Java中的作用及其工作原理:

  1. 互斥锁: synchronized提供了一种锁机制,能够确保同一时刻只有一个线程执行某段代码。
  2. 对象锁和类锁: 可以锁定对象实例(方法或代码块)或整个类(静态方法)。
  3. 内存可见性: 保证了锁内操作对其他线程的可见性。
  4. 锁升级: 在JVM中,synchronized可能经历偏向锁、轻量级锁和重量级锁的升级。

九夏...大约 20 分钟
面试

永鼎

入门题

EAtsqc

B false true false false 1

笔试题

  1. 手写个单例模式
  2. 父线程中断子线程是否会中断
  3. union和 union All的区别、count(*)、count(1)、count(All 字段)、count(distinct 字段)的区别

九夏...大约 2 分钟
设计理念和设计目标

设计理念

RocketMQ设计基于主题的发布与订阅模式,其核心功能包括消息发送、消息存储和消息消费,整体设计追求简单和性能高效,主要体现在如下3个方面。

  1. 摒弃了业界常用的将ZooKeeper作为信息管理的“注册中心”,而是自研NameServer实现元数据的管理(topic路由信息等)
  2. 高效的I/O存储机制。
  3. 容忍存在的设计缺陷。

为什么不用 Zookeeper 而是自研 NameServer?

topic 路由信息无需在集群之间保持强一致,而是追求最终一致性,并且能够容忍分钟级别的不一致。真是因为这,RocketMQ的NameServer集群之间互不通信,这样极大地降低了NameServer实现的复杂度,对网络的要求也降低了不少,性能相比较ZooKeeper还有了极大的提升。


九夏...大约 6 分钟it中间件RocketMQ源码
NameServer原理

架构设计

架构设计
架构设计
  1. NameServer 启动后每隔 10s 扫描一下 brokerLiveTable,检测表中上次心跳包的时间,如果间隔超过 120s 则认为该 broker 不可用,移出路由表中与该 broker 相关的路由信息。
  2. broker 启动后每过 30s 向 NameServer 发送心跳包,并传输路由信息,NameServer 进行保存。
  3. 生产者启动后会和 NameServer、broker 进行长连接。生产者每隔 30s 向 NameServer 获取路由信息。
  4. 消费者每 30s 向 NameServer 获取路由信息

九夏...大约 4 分钟it中间件RocketMQ源码