小红书商业化技术Java一面(挂)
十月份约的面试,挂了
- 你写的两个线程交替打印1-100的代码,先打印一下结果我看一眼。
- 我们聊一下Java的锁,你可以找一些角度对Java的锁进行分类,然后我们聊一下具体的内容。
- 你为什么会这么对Java的锁进行分类?有这样分类的理由吗?
- 那你理解的悲观锁就是synchronized加monitor,乐观锁就是CAS相关的东西,是这样吗?
- 你刚刚说的synchronized的底层流程,能再具体说一下吗?
- 你刚刚说synchronized性能比较差,是这样吗?它的性能一定比较差吗?
- 我们聊一下Lock的底层数据结构是怎样的。
- Lock怎么实现公平与非公平锁呢?
- 忘了没关系,我们可以一起梳理下Lock的底层结构——你刚刚说它是‘state变量’加队列”,你再思考下,它是怎么通过这个结构实现锁的?
- 那我换种方式问:Lock底层队列里的节点存的是什么东西?你知道吗?
- 既然你不清楚节点存储的内容,那你想想:如果让你自己实现一把并发锁,队列里需要保存什么信息,才能实现锁的功能?多线程下怎么通过这个队列控制线程竞争锁?
- 你了解Java的集合吗?如果学习过,从底层给我介绍一下Java集合。
- 你说集合分为Collection和Map两大类,那Collection的结构、分层是怎样的?
- Collection里除了List,还有什么其他类型?
- 你了解Map吗?
- HashMap中当链表长度达到阈值后会转红黑树,为什么一定要用红黑树呢?
- 你大概了解红黑树吗?为什么HashMap要选择红黑树,而不是其他二叉树?
- HashMap是线程安全的吗?
- 那HashMap在多线程环境下会有什么问题?
- 你提到多线程下HashMap的操作无法保证原子性,能具体说一下吗?比如举个实际场景分析,比如HashMap扩容时,多线程下会出现什么问题?
- 说实话,你有想过HashMap扩容时多线程下出现问题的具体场景吗?比如当一个线程在扩容、另一个线程也在操作时,两个线程分别处于什么状态、在做什么操作,才会导致问题?
- 你刚才提到HashMap的锁,说1.8之前是分段锁、1.8之后是局部锁,你说的“分段锁”“局部锁”具体指的是什么?
- 你刚才说的锁的具体内容,能再明确一下吗?
- 你说锁的是代码块,那在HashMap的数据结构里,这个代码块锁的是什么对象(或资源)呢?
- 你觉得实现一个高性能的HashMap,最重要的是什么?
- 你了解HashMap的哈希函数吗?或者说你看过HashMap的哈希函数,它是怎样的?
- HashMap的哈希函数是怎么保证哈希值分布均匀的?
- 直白地说,HashMap的哈希函数为什么能保证哈希值分布均匀?
- 我们聊一下Redis,Redis支持的数据结构有哪些?
- 你了解过Redis中HashMap的扩容机制吗?
- Redis的部署模式你了解吗?
- 那Redis的哨兵模式怎么部署?你大概介绍一下。
- 哨兵节点是单个还是多个?它的作用是什么?
- 你觉得Redis哨兵这种分布式部署模式会有什么问题吗?
- Redis主从节点的数据同步是怎样的?每个Redis节点的数据是如何保持一致的?
- 那有什么办法能做到Redis数据不丢失吗?
- 你用Redis实现过分布式锁吗?
- 那Redis实现分布式锁是怎么保证原子性的?
- 实现分布式锁时,通常有两步操作:一是set值,二是设置有效期。这两步操作怎么保证原子性呢?
- 在Redis集群模式下,用Redis实现分布式锁会有什么问题?
- 我想问一下,你用Redis读数据时,读的是主节点还是从节点?
- 那如果读从节点,这种情况下可能会出现什么问题吗?
牛牛的面试专栏 文章被收录于专栏
牛牛的面试专栏,希望自己在25年可以拿到一份大厂的SP Offer 你的点赞和收藏都是我持续更新的动力
