哈,你竟然敢问面试的坑挖多深,仅 Java
基础来说:
- HashCode为什么用31作为乘数,你证明过吗?
- 扰动函数的函数作用是什么,它还有什么场景在用?
- 拉链寻址和开放寻址具体是什么表现,怎么解决的碰撞问题?
- ThreadLocal 的实现中还有黄金分割点的使用,你知道吗?
- CLH、MCS,都是怎么实现的公平锁,代码是什么样?
- jvmti 可以用于非入侵的监控线程池状态,你用过吗?
关于以上的问题,是不有种即使看过 Java 核心 API 的源码,也很难回答出来?
这是因为 Java 代码本身就是基于数据结构和算法对数学逻辑的具体实现,而那些隐含在代码中的数学知识如果你不会,那么压根你就会忽略掉它,也就因此看不懂源码了。如果你感兴趣这也的技术广度和深度,也可以和我一起折腾,来吧!
传送门
接下来分享个小伙伴面美团一面,求职方向是团队技术负责人。此次面试以连环追问的方式为主,喜欢刨根问底,非常考研面试者的技术功底。以下是整理出的部分面试题
,我们看看这些题该如何回答。
美团现场面试
先让写个线程安全的单例模式
public class Singleton { private static volatile Singleton instance; private Singleton() { } public static Singleton getInstance(){ if(null != instance) return instance; synchronized (Singleton.class){ if (null == instance){ instance = new Singleton(); } } return instance; } }
- 考察线程安全的单例模式,一方面是对基础的了解,另一方面以单例模式作为入口考察并发编程的知识点。
- 在这里你要知道,并发编程的三要素包括:原子性、可见性、有序性。
- 那具备三要素知识点的单例模式,主要是如上案例中的
双重检查锁
和CAS忙等策略。而双重检查锁的单例方式,对于面试官和求职者来说,可以往下继续聊的点就有了。 - 当然,如果你没有写出这样一种单例模式,大概率会被面试官引导过来。在面试的过程中最好的方式是主动和引导面试官走,也称对脾气,也就是技术臭味相投的感觉。
高并发下,单例模式会存在哪些问题?
- 单例模式就是以防止线程不安全和提高代码执行效率而设计的。
- 双重锁定检查(DCL,Double Check Lock),也就是为此设计的。别被 DCL 唬住喽
可见性和指令重排是怎么回事?
- 可见性,Java 编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排它锁单独获得这个变量。
- 指令重排,在程序执行过程中为了性能考虑,,编译器和 CPU 可能会对指令重新排序。对于并发多线程场景下,指令重排会产生不确定的执行效果。
voliate 关键字为什么可以解决可见性和指令重排?
可见性
- 首选,volatile 关键字修饰的共享变量