8.moka一面

  1. 线程池的使用与原理:

    • 实习业务中使用线程池:在实习中,我使用线程池来处理大量的异步任务,如数据处理、文件上传下载等,以提高系统的响应速度和吞吐量。

    • 如何复用线程池:通过配置核心线程数和最大线程数,线程池可以在不销毁核心线程的情况下复用线程,从而减少线程创建和销毁的开销。

    • 确保线程正常执行任务:通过实现RunnableCallable接口,并将任务提交给线程池执行。

    • 线程池底层原理:线程池通过维护一个线程集合和一个任务队列(通常是阻塞队列)来工作。当任务提交时,线程池会根据当前线程数和任务队列的情况来决定是创建新线程还是复用已有线程。

    • 为什么使用阻塞队列:阻塞队列可以有效地将任务的生产者和消费者分离,同时支持线程间的协作和资源的合理利用。

    • 单线程优先级调节:在Java中,可以通过Thread.setPriority()方法调节线程的优先级,但实际效果依赖于操作系统的调度策略。

    • 阻塞队列的作用:提供线程安全的任务队列,并支持阻塞操作,确保生产者和消费者之间的同步。

  2. 线程池相关问题:

    • 任务超时解决:可以设置任务执行的超时时间,使用Future对象来取消或检查任务的状态。

    • CountDownLatch操作:CountDownLatch可以在任何地方调用countDown()方法来减少计数,通常在线程完成任务后调用。它是局部的,可以在局部变量中使用。

    • 红锁算法:Redis分布式锁的红锁算法通过多个Redis实例上的锁来实现分布式环境下的锁,确保在多个节点上锁的原子性。

  1. Redis分布式锁与看门狗机制:

    • SETNX原理:SETNX(Set If Not Exists)是一个原子操作,如果键不存在,则设置键值对并返回1,否则返回0。

    • 看门狗机制:用于自动续期锁的过期时间,防止任务未完成时锁过期。

  2. 订单操作一致性:保持订单操作一致性是为了确保数据的一致性和准确性,避免出现数据冲突和错误。

  1. 复用样式对象方案:可能使用的是享元模式(Flyweight Pattern),通过共享相同或相似的对象来减少内存使用。

  2. 架构设计问题:为了防止静态变量被修改,可以将其设置为私有并通过公共方法提供访问,或者使用枚举类型来定义常量。

  1. MQ(消息队列)相关:

    • 基础模型:生产者-消费者模型,生产者发送消息,消费者接收消息。

    • 消息可靠性:通过消息确认机制、持久化存储、事务消息等手段保证消息的可靠性。

    • 消息刷盘时机:通常在消息被确认消费后或在特定时间间隔后刷盘。

    • 死信队列:用于处理无法正常消费的消息。

    • 延迟队列:用于延迟处理消息。

  2. Java数据类型与集合:

    • Java数据类型:基本数据类型(如int, float, double)和引用数据类型(如类、接口、数组)。

    • 常见集合:ArrayListLinkedListHashMapHashSet等。

    • LinkedListArrayList效率:ArrayList在随机访问上效率更高,LinkedList在插入和删除操作上效率更高。

  1. 锁结构与JUC工具类:

    • 锁结构:如synchronizedReentrantLockReadWriteLock等。

    • JUC工具类:如SemaphoreCountDownLatchCyclicBarrierExchanger等。

  2. 线程安全性与锁:

    • 线程安全性:当多个线程访问同一资源时,不会出现数据不一致或错误的情况。

    • 线程安全问题防范:使用同步机制、锁、原子变量等。

    • synchronized使用:通常锁住共享资源或方法。

    • 锁失效场景:如锁定的对象发生变化。

    • ReentrantLock底层数据结构与原理:基于AQS(AbstractQueuedSynchronizer)实现,通过一个状态变量来控制锁的获取和释放。

    1. 锁的深入讨论:

      • 公平锁与非公平锁:ReentrantLock的公平锁和非公平锁通过构造函数中的参数来区分。公平锁保证等待时间最长的线程先获取锁,非公平锁则允许新来的线程抢占锁。

      • 锁竞争优先级:在非公平锁中,新来的线程可能会抢占已经在等待的线程,而在公平锁中,则是先来先服务的原则。

      • 其他锁:除了ReentrantLock,还有ReentrantReadWriteLockStampedLock等。

      • 信号量保证线程安全:Semaphore可以用来限制对某个资源的访问数量,从而在一定程度上保证线程安全。

    2. MySQL的隔离级别与索引:

      • 隔离级别:MySQL支持以下隔离级别:

        • READ UNCOMMITTED

        • READ COMMITTED

        • REPEATABLE READ(默认隔离级别)

        • SERIALIZABLE

      • 索引创建条件:索引通常在以下情况下创建:

        • 经常用于查询的列

        • 经常用于排序或分组的列

        • 经常用于连接的列

      • 索引创建原则:选择区分度高的列,避免过度索引,考虑索引维护的成本等。

      • 联合索引失效:如果查询条件不满足联合索引的最左前缀原则,则可能导致索引失效。

      • 索引下推:索引下推(Index Condition Pushdown)是MySQL的一种优化技术,它将部分过滤条件下推到存储引擎层,减少数据访问量。

    1. 线程安全与锁的深入讨论:

      • 线程锁住的对象变化:如果锁住的对象发生变化,可能会导致锁失效或出现线程安全问题。通常应该锁住不会变化的对象,或者使用不可变对象。

      • 如果不是锁住对象实例:可以考虑锁住一个特定的锁对象,比如Lock实例,或者使用类锁(Class对象锁)。

      • ReentrantLock的底层数据结构与原理:ReentrantLock底层依赖于AbstractQueuedSynchronizer(AQS),它使用一个int类型的变量来表示同步状态,并通过队列来管理等待的线程。

    2. JUC工具类与线程安全:

      • JUC工具类:Java并发工具类,如SemaphoreCountDownLatchCyclicBarrierExchanger等,提供了丰富的并发编程工具。

      • 线程安全:当多个线程访问同一个对象时,如果不需要考虑线程间的同步问题,那么这个对象就是线程安全的。

    1. synchronized的深入讨论:

      • synchronized锁住的是什么:synchronized可以锁住代码块或方法,实际上锁住的是对象监视器(monitor),对于同步方法,锁的是当前对象实例;对于静态同步方法,锁的是类的Class对象。

      • 锁住对象实例的变化:如果对象实例在锁住期间发生变化,可能会导致锁的粒度不正确或锁失效。

      • 使用ReentrantLockReentrantLock提供了比synchronized更灵活的锁操作,可以显式地获取和释放锁,还可以实现公平锁等。

      1. MySQL索引与性能优化:

        • 索引失效的情况:除了不满足最左前缀原则外,以下情况也可能导致索引失效:

          • 使用函数或计算表达式导致索引列无法直接使用。

          • 在WHERE子句中使用不等于(<>)或IS NULL可能会导致索引失效。

          • 使用LIKE操作符时,如果通配符不在字符串的开头,例如LIKE '%value',可能会导致索引失效。

        • 索引优化的原则:

          • 选择合适的索引类型,如BTREE或HASH。

          • 避免过多的索引,因为每个索引都会增加写操作的成本。

          • 定期分析查询日志和执行计划,优化慢查询。

      2. 线程锁的深入讨论:

        • 锁的粒度:选择合适的锁粒度是重要的,过粗的锁可能导致不必要的阻塞,而过细的锁可能导致复杂的代码逻辑和性能开销。

        • 锁竞争和线程饥饿:在高并发环境下,锁竞争可能导致某些线程长时间无法获取锁,造成线程饥饿。

        • 锁的公平性和非公平性:公平锁虽然可以避免线程饥饿,但可能会降低系统的吞吐量;非公平锁可以提高吞吐量,但可能导致某些线程长时间等待。

      1. Java集合类的深入讨论:

        • LinkedListArrayList的选择:

          • ArrayList适合随机访问操作,因为它的时间复杂度为O(1)。

          • LinkedList适合插入和删除操作,因为它的时间复杂度为O(1)。

        • Java中复用链表的数据结构:除了LinkedList,还有LinkedHashMapLinkedHashSet等,它们在哈希表的基础上增加了链表结构,以保持元素的插入顺序。

      2. 数据结构与算法的深入讨论:

        • 支持二分查找的链表:理论上,链表不支持高效的二分查找,因为链表不支持随机访问。但是,可以通过平衡二叉搜索树(如AVL树或红黑树)来实现类似的功能,这些树结构可以在O(log n)时间内进行查找、插入和删除操作。

      1. 锁结构与JUC工具类的深入讨论:

        • JUC工具类SemaphoreSemaphore可以用来实现资源池,限制同时访问资源的线程数,从而保证线程安全。

        • CountDownLatchCyclicBarrier:这两个类可以用于线程间的协作,CountDownLatch用于等待多个线程完成任务,而CyclicBarrier则用于多个线程在某个点上同步。

      2. 线程安全性的深入讨论:

        • 线程安全性问题的防范:除了使用锁,还可以通过以下方式来防范线程安全性问题:

          • 使用原子变量,如AtomicIntegerAtomicReference等。

          • 使用线程安全集合类,如ConcurrentHashMapCopyOnWriteArrayList等。

          • 使用不可变对象,如StringInteger等。

      1. synchronized的深入讨论:

        • synchronized锁住的对象实例变化:如果对象实例在锁住期间被修改,可能会导致锁的粒度不正确或锁失效。为了避免这种情况,可以锁住一个不可变的对象或使用final关键字确保对象引用不会改变。
      2. ReentrantLock的深入讨论:

        • ReentrantLock的公平锁和非公平锁的实现:公平锁在tryAcquire方法中会检查队列中是否有等待的线程,而非公平锁则可能会直接尝试获取锁。

        • 锁竞争的优先级:在非公平锁中,新来的线程可能会抢占已经在等待的线程,这取决于线程调度和锁的实现。

#秋招提前批启动你开冲了吗##简历中的项目经历要怎么写##牛客创作赏金赛##我的成功项目解析##我的失利项目复盘#
Java大中厂秋招八股一本通 文章被收录于专栏

八股文分类整理 老哥们点点赞,订阅一下,纯福利做数据。

全部评论

相关推荐

2025-12-28 20:47
已编辑
北京工商大学 Java
程序员牛肉:我靠你这个实习经历其实最需要担心的点是你做的太多了,可能会被面试官怀疑是你伪造的。 交易状态机是你做的,支付多渠道是你做的,对账是你做的,结算还是你做的,重复支付也是你做的,整个服务的异常处理也是你做的。 其实你这个反而问题很大的,你想想站在面试官的角度,他是真的会相信你的能力很强,还是相信这份实习你伪造了大部分?我相信你真的做了这么多,但是删一些,废话删一删。你这个做的太多了反而真实性不可信。 后面再补一个项目,在github上找一个高star的项目学一学然后写到自己简历上。我觉得你能力肯定没问题。28届能做到这个份上很厉害,但是在求职市场中,你不是在跟28届的同学比,把你这个简历放到27届其实也就一般水平。 所以后续要想一想看看能不能给自己简历上搞点亮点,比如开源贡献呢?比如博客呢?
实习要如何选择和准备?
点赞 评论 收藏
分享
02-14 07:38
已编辑
门头沟学院 Java
2.4&nbsp;一面2.6&nbsp;二面2.9&nbsp;三面(hr面)2.13&nbsp;oc1.15号收到面试电话那会就开始准备,因为一开始没底所以选择推迟一段时间面试,之后开始准备八股,准备实习可能会问的东西,这期间hot100过了有六七遍,真的是做吐了快,八股也是背了忘,忘了背,面经也看了很多,虽然最后用上的只有几道题,可是谁知道会问什么呢自从大二上开始学java以来,一路走来真的太痛了,一开始做外卖,点评,学微服务,大二下五六月时,开始投简历,哎,投了一千份了无音讯,开始怀疑自己(虽然能力确实很一般),后来去到一家小小厂,但是并不能学到什么东西,而且很多东西都很不规范,没待多久便离开,大二暑假基本上摆烂很怀疑自己,大三上因为某些原因开始继续学,期间也受到一俩个中小厂的offer,不过学校不知道为啥又不允许中小厂实习只允许大厂加上待遇不太好所以也没去,感觉自己后端能力很一般,于是便打算转战测开,学习了一些比较简单的测试理论(没有很深入的学),然后十二月又开始继续投,java和测开都投,不过好像并没有几个面试,有点打击不过并没有放弃心里还是想争一口气,一月初因为学校事比较多加上考试便有几天没有继续投,10号放假后便继续,想着放假应该很多人辞职可能机会大一点,直到接到字节的面试,心里挺激动的,总算有大厂面试了,虽然很开心,但同时压力也很大,心里真的很想很想很想进,一面前几天晚上都睡不好觉,基本上都是二三点睡六七点醒了,好在幸运终于眷顾我一次了(可能是之前太痛了),一面三十几分钟结束,问的都不太难,而且面试官人挺好但是有些问题问的很刁钻问到了测试的一些思想并不是理论,我不太了解这方面,但是也会给我讲一讲他的理解,但是面完很伤心觉得自己要挂了。但是幸运的是一面过了(感谢面试官),两天后二面,问的同样不算难,手撕也比较简单,但也有一两个没答出来,面试官人很好并没有追问,因为是周五进行的二面,没有立即出结果,等到周一才通知到过了,很煎熬的两天,根本睡不好,好在下周一终于通知二面过了(感谢面试官),然后约第二天三面,听别的字节同学说hr面基本上是谈薪资了,但是我的并不是,hr还问了业务相关的问题,不过问的比较浅,hr还问我好像比较紧张,而且hr明确说了还要比较一下,我说我有几家的面试都拒了就在等字节的面试(当然紧张,紧张到爆了要),三面完后就开始等结果,这几天干啥都没什么劲,等的好煎熬,终于13号下午接到了电话通知oc了,正式邮件也同时发了,接到以后真的不敢信,很激动但更重要的是可以松一口气了,可以安心的休息一下了终于可以带着个好消息过年了,找实习也可以稍微告一段落了,虽然本人很菜,但是感谢字节收留,成为忠诚的节孝子了因为问的比较简单,面经就挑几个记得的写一下一面:1.实习项目的难点说一下2.针对抖音评论设计一下测试用例3.手撕:合并两个有序数组二面:1.为什么转测开2.线程进程区别,什么场景适合用哪个3.发送一个朋友圈,从发出到别人看到,从数据流转的角度说一下会经历哪些过程4.针对抖音刷到广告视频设计测试用例5.手撕:无重复字符的最长字串
查看8道真题和解析
点赞 评论 收藏
分享
评论
4
15
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务