小米二面 4.2
自我介绍
1.一个线程如何控制接口限频
- 基于数据库(Mysql为例)的统计进行限流
- 基于redis自增长及过期策略的限流
- 基于内存(linkedlist为例)的限流
- 基于木桶算法的限流
2.红黑树 哪里用到了红黑树?
- java8 hashmap中链表转红黑树。
- epoll在内核中的实现,用红黑树管理事件块(文件描述符)。
- Java的TreeMap实现
3.b+树 b树 使用场景
数据库 文件系统
4.为什么要有多线程?
- 从计算机底层来说: 线程可以比作是轻量级的进程,是程序执行的最小单位,线程间的切换和调度的成本远远小于进程。另外,多核 CPU 时代意味着多个线程可以同时运行,这减少了线程上下文切换的开销。
- 从当代互联网发展趋势来说: 现在的系统动不动就要求百万级甚至千万级的并发量,而多线程并发编程正是开发高并发系统的基础,利用好多线程机制可以大大提高系统整体的并发能力以及性能。
再深入到计算机底层来探讨:
- 单核时代:在单核时代多线程主要是为了提高单进程利用 CPU 和 IO 系统的效率。 假设只运行了一个 Java 进程的情况,当我们请求 IO 的时候,如果 Java 进程中只有一个线程,此线程被 IO 阻塞则整个进程被阻塞。CPU 和 IO 设备只有一个在运行,那么可以简单地说系统整体效率只有 50%。当使用多线程的时候,一个线程被 IO 阻塞,其他线程还可以继续使用 CPU。从而提高了 Java 进程利用系统资源的整体效率。
- 多核时代: 多核时代多线程主要是为了提高进程利用多核 CPU 的能力。举个例子:假如我们要计算一个复杂的任务,我们只用一个线程的话,不论系统有几个 CPU 核心,都只会有一个 CPU 核心被利用到。而创建多个线程,这些线程可以被映射到底层多个 CPU 上执行,在任务中的多个线程没有资源竞争的情况下,任务执行的效率会有显著性的提高,约等于(单核时执行时间/CPU 核心数)。
5.多线程一定比单线程快吗?
- 线程管理开销:创建和管理线程(如线程的创建、销毁和切换)本身需要时间和资源。如果这些管理操作的开销超过了多线程带来的性能提升,则可能不会看到速度的提升。
- 竞争状态(Race Condition):多线程访问共享资源可能会引起竞争状态,需要额外的同步机制(如锁),这会增加额外的开销。
- 资源限制:如果任务主要受到IO(输入/输出操作)的限制,那么多线程可能并不会提供很好的速度提升,因为磁盘IO操作可能会成为瓶颈。
- 内存带宽:如果多个线程都尝试同时访问内存,可能会超出内存带宽的容量,导致线程之间相互拥塞,反而减慢速度。
单核 CPU 同时运行多个线程的效率是否会高,取决于线程的类型和任务的性质。一般来说,有两种类型的线程:CPU 密集型和 IO 密集型。CPU 密集型的线程主要进行计算和逻辑处理,需要占用大量的 CPU 资源。IO 密集型的线程主要进行输入输出操作,如读写文件、网络通信等,需要等待 IO 设备的响应,而不占用太多的 CPU 资源。
在单核 CPU 上,同一时刻只能有一个线程在运行,其他线程需要等待 CPU 的时间片分配。如果线程是 CPU 密集型的,那么多个线程同时运行会导致频繁的线程切换,增加了系统的开销,降低了效率。如果线程是 IO 密集型的,那么多个线程同时运行可以利用 CPU 在等待 IO 时的空闲时间,提高了效率。
因此,对于单核 CPU 来说,如果任务是 CPU 密集型的,那么开很多线程会影响效率;如果任务是 IO 密集型的,那么开很多线程会提高效率。当然,这里的“很多”也要适度,不能超过系统能够承受的上限。
6.用多线程会产生什么问题?
内存泄漏、死锁、线程不安全
7.synchronized
8.垃圾回收算法 g1?
9.AOP 底层实现?
10.为什么需要AOP?
11.tcp和udp的区别
12.tcp如何建立连接
算法
lc33
智力题 烧绳子
#软件开发2024笔面经#