小米二面 4.2

自我介绍

1.一个线程如何控制接口限频

  • 基于数据库(Mysql为例)的统计进行限流
  • 基于redis自增长及过期策略的限流
  • 基于内存(linkedlist为例)的限流
  • 基于木桶算法的限流

2.红黑树 哪里用到了红黑树?

  1. java8 hashmap中链表转红黑树。
  2. epoll在内核中的实现,用红黑树管理事件块(文件描述符)。
  3. 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.多线程一定比单线程快吗?

  1. 线程管理开销:创建和管理线程(如线程的创建、销毁和切换)本身需要时间和资源。如果这些管理操作的开销超过了多线程带来的性能提升,则可能不会看到速度的提升。
  2. 竞争状态(Race Condition):多线程访问共享资源可能会引起竞争状态,需要额外的同步机制(如锁),这会增加额外的开销。
  3. 资源限制:如果任务主要受到IO(输入/输出操作)的限制,那么多线程可能并不会提供很好的速度提升,因为磁盘IO操作可能会成为瓶颈。
  4. 内存带宽:如果多个线程都尝试同时访问内存,可能会超出内存带宽的容量,导致线程之间相互拥塞,反而减慢速度。

单核 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笔面经#
全部评论

相关推荐

流程:3-07投递笔试:3-20一面:3-27自我介绍说说你的服务器项目说说项目中的亮点说一下http和https的区别给了一段代码,问是否有问题(浅拷贝和深拷贝)让完成深拷贝代码给了一段拷贝构造函数,值传递的形式问有什么问题给了一段代码,问的是顶层const和底层const你用过lamda吗右值引用说一下a和&aSTL用过吗举列说三个STLvector和list有什么区别map和set的区别有没有遇到过迭代器失效的问题,怎么解决给了一段代码,用迭代器修改了set的某一个值,问是否有问题构造函数为什么不能定义成虚函数析构函数为什么一定要定义成虚函数纯虚函数和虚函数的区别假设有一个类,他有自己的虚函数表,现在继承他,子类的虚函数表是否一样说说你对多态的理解说一说你遇到隐藏的时候是怎么做的重写的时候如何调用基类的函数说一说死锁问题,如何预防手撕题目:力扣142. 环形链表 II二面:4-8自我介绍说一说你的项目智能指针用过没有,说一下析构函数设置成虚函数的原因STL用过哪些vector的扩容机制既然你知道vector扩容会把之前的内容复制一份放到新空间,那么如何节省这一部分开销vector的capacity和resize说说map和unordered_map的区别对于已知大小的数据,用map和unordered_map哪一个更省内存说一说queue,deque,priority_queue说一说list模板用过吗模板底层了解过吗手撕题目:给了一幅图,求最大的岛屿面积4-17:电话oc隔了一个小时发offer了
点赞 评论 收藏
转发
一、项目+八股(55min)1、自我介绍2、简单介绍一下你的项目3、压测的性能瓶颈?怎么调试的?4、缓存的数据一致性问题怎么解决的?为什么选择这个方案?还可以优化吗?5、Redis为什么快?6、Redis的数据结构?7、Redis内存淘汰策略?8、什么是可重入?如何基于Redis实现一个可重入的分布式锁?9、set和set nx命令有什么区别?10、zet如何优化底层的查询的?11、设计冗余字段的背景是什么?优点是什么?缺点又是什么?12、MySQL的索引结构?13、为什么一般采用自增ID当主键?14、为什么做深度分页的时候会很慢?15、MySQL的日志文件主要有哪几种?16、事务管理通过哪些文件来管理的?17、String、StringBuilder和StringBuffer的区别?18、Synchorized和Lock的区别?19、Synchorized的锁升级过程?20、学习Java过程中,有没有什么事情是你反复练习的事情?21、介绍一件收获最大的事情?22、介绍一下项目中的多机竞争?怎么优化的?23、多机竞争的核心本质是什么?24、分表为什么要按照大小分表?有没有别的思路?分表解决的问题是冷热分离吗?25、用什么其他方案能够解决冷热数据的问题?26、怎么通过任务ID来定位到存储的表的?27、在任务生成前已经知道该任务存储到哪里了?28、你怎么知道切表了?二、算法(25min)重排链表(没做过,做了半天A了一半测试用例,面试官让说了一下思路)三、反问(5min)您觉得我本次面试有什么不足的地方?可以提供一些建议吗?(1)基础扎实,但是缺乏实践(2)实践的时候要多思考,选用哪种方案?为什么选用这种方案?有没有其他更好的方案?不要闭门造车。四、总结面试官很和蔼,遇到不会的问题也是循序渐进地引导,就是对于项目的拷打太狠了,另外算法还是刷的少了面完3分钟,北森代发短信通知过了,有佬知道美团会用这玩意吗?我一度怀疑是不是美团发的短信,如果我的外卖也能有这么高的效率就好了
点赞 评论 收藏
转发
3 16 评论
分享
牛客网
牛客企业服务