第一轮面试:集合与多线程基础
面试官:说说ArrayList扩容机制? 王铁牛:这个简单!默认10个元素,不够就1.5倍扩容,用Arrays.copyOf实现。 面试官:(点头)不错,那HashMap头插法有什么隐患? 王铁牛:呃...可能会让元素顺序倒过来? 面试官:错!多线程下会导致死循环,JDK8已改用尾插法。
第二轮面试:JVM与并发进阶
面试官:强引用和弱引用怎么选型? 王铁牛:缓存用弱引用,内存不够就回收! 面试官:基本正确。那ThreadLocal内存泄露原理? 王铁牛:线程池复用导致Entry堆积...应该用remove清理! 面试官:(微笑)很好,知道预防措施。
第三轮面试:中间件实战
面试官:Redis分布式锁怎么实现续期? 王铁牛:设置30秒过期不就行了? 面试官:任务超时30秒怎么办?要用看门狗机制啊! 王铁牛:(冒汗)这个...下次会注意
技术解析
- ArrayList扩容:初始容量10,触发扩容时
newCapacity = oldCapacity + (oldCapacity >> 1)
- HashMap死循环:多线程rehash时形成环形链表,get操作CPU飙升
- ThreadLocal内存泄露:Entry的key是弱引用,但value是强引用,必须remove
- Redis分布式锁:推荐Redisson的
tryLock
方法,内置看门狗自动续期