JAVA问答挑战3
- [Q1. JUC中的常见类有哪些?](#Q1. JUC中的常见类有哪些?)
- [Q2. synchronized是什么锁?](#Q2. synchronized是什么锁?)
- [Q3. 出现线程安全问题的原因?](#Q3. 出现线程安全问题的原因?)
- [Q4. 介绍一下IP协议?](#Q4. 介绍一下IP协议?)
- [Q5. MySQL索引底层使用的什么数据结构?该数据结构有什么特点?](#Q5. MySQL索引底层使用的什么数据结构?该数据结构有什么特点?)
Q1. JUC中的常见类有哪些?
JUC(java.util.concurrent)包主要包含以下几大类:
- 原子类(Atomic): 如
AtomicInteger、AtomicLong、AtomicBoolean。利用CAS(Compare And Swap)机制保证原子性,比传统的synchronized更轻量。 - 锁(Lock): 如
ReentrantLock、ReentrantReadWriteLock。提供了比synchronized更灵活的锁机制,支持公平锁、非公平锁、可中断锁等。 - 并发容器: 如
ConcurrentHashMap(线程安全的HashMap)、CopyOnWriteArrayList(写时复制)、BlockingQueue(阻塞队列,如LinkedBlockingQueue、ArrayBlockingQueue)。 - 线程池(Executor Framework): 核心是
ExecutorService接口,常用实现类如ThreadPoolExecutor、ScheduledThreadPoolExecutor。通过工厂类Executors可以快速创建不同类型的线程池(如固定线程数、缓存线程池)。 - 并发工具类(辅助类): 如
CountDownLatch(倒计时门栓)、CyclicBarrier(循环栅栏)、Semaphore(信号量)、Exchanger(线程间交换数据)。
Q2. synchronized是什么锁?
分析: 这是一个进阶问题,考察你对JVM底层锁机制的理解,不仅仅是"它是互斥锁"。
参考回答思路:
- 基本定义:
synchronized是Java内置的关键字,它是一种互斥锁(Mutex Lock),用来保证同一时刻只有一个线程可以执行被它修饰的代码块或方法。 - 锁的类型:
- 悲观锁: 它假设冲突一定会发生,所以在执行代码前先加锁。
- 可重入锁: 线程可以进入任何一个它已经拥有的锁所同步着的代码块。
- 非公平锁: 线程获取锁的顺序不是遵循FIFO原则,有可能刚释放锁的线程能再次获取锁(偏向锁/轻量级锁的自旋机制)。
- 底层实现(JVM层面):
- 它是基于Monitor(监视器) 对象实现的。
- 在对象头(Object Header)中维护了Mark Word,用于记录锁的状态(无锁、偏向锁、轻量级锁、重量级锁)。
- 锁升级: 无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁。这种机制是为了减少同一线程获取同一把锁的开销。
Q3. 出现线程安全问题的原因?
出现线程安全问题的核心原因是多线程环境下对共享资源的非原子性、非可见性或非有序性操作。
- 原子性(Atomicity): 一个或多个操作要么全部执行且执行过程不被中断,要么完全不执行。如果一个操作被线程切换打断,就可能产生脏数据。例如
i++操作实际上包含了读取、修改、写入三个步骤,这三个步骤不是原子的。 - 可见性(Visibility): 当一个线程修改了共享变量的值,其他线程能够立即得知这个修改。由于JMM(Java内存模型)中存在工作内存 和主内存的概念,线程修改变量后可能还没刷新回主内存,其他线程读到的就是旧值。
- 有序性(Ordering): 程序执行的顺序按照代码的先后顺序执行。由于编译器优化、指令重排或内存屏障失效,可能导致指令执行顺序改变,从而引发问题。
Q4. 介绍一下IP协议?
分析: 这是计算机网络的基础,考察你对网络层的理解。
参考回答思路:
- 定义: IP(Internet Protocol)协议是TCP/IP协议族的核心,位于网络层。它主要负责寻址 和路由。
- 核心功能:
- 不可靠传输: IP协议本身不保证数据一定能到达目的地,不保证数据包的顺序,也不保证数据的完整性(这些由上层的TCP或UDP负责)。
- 无连接: 每个数据包都是独立处理的,发送方不需要建立连接。
- 地址管理: 使用IP地址(IPv4或IPv6)来标识网络中的主机。
- IP数据报: IP数据包由首部 (包含源IP、目标IP、版本号等)和数据部分(通常是TCP或UDP的报文)组成。
- 版本:
- IPv4: 32位地址,数量有限,面临枯竭。
- IPv6: 128位地址,解决了地址短缺问题,并增强了安全性。
Q5. MySQL索引底层使用的什么数据结构?该数据结构有什么特点?
分析: 数据库是后端面试的重头戏,这个问题考察你对InnoDB引擎的理解。
参考回答思路:
- 数据结构: MySQL InnoDB存储引擎的索引底层使用的是 B+树(B Plus Tree)。
- 为什么不用二叉树/红黑树/Hash?
- 二叉树/红黑树: 数据量大时树会很高,IO次数多(树的高度决定了磁盘IO次数)。
- Hash: 无法支持范围查询(
>、<、BETWEEN),也不支持排序和模糊查询(LIKE)。
- B+树的特点:
- 非叶子节点不存数据: 只存索引(键),这使得单个节点可以容纳更多的键,从而降低了树的高度,减少了磁盘IO次数。
- 叶子节点存数据: 所有数据都存在叶子节点,并且叶子节点之间通过指针连接,形成一个有序链表。
- 优点: 既支持高效的精确查找 ,又支持高效的范围查找 (遍历链表)和排序。