每天一套面试题Day18-阿里巴巴高频(1)
1.如何创建线程池?线程池常见参数有哪些?
ThreadPoolExecutor构造函数或Executors工具类实现 核心参数包括:核心线程数(维持常驻线程)、最大线程数(扩容上限)、存活时间(非核心线程空闲时长)、任务队列(存放待执行任务)、拒绝策略(队列满时的处理方式),threadFactory 线程工厂,用于创建线程
2.说说volatile的用法及原理。
我的博客详解 volatile通过缓存一致性协议保证可见性,通过内存屏障解决指令重排序
3.讲一下Java里的CAS。
我的博客详解 CAS(Compare-And-Swap)CAS操作包含三个核心参数:内存位置V、期望值A和新值B。它的执行逻辑是:只有当内存位置V的当前值等于期望值A时,才会将V的值更新为B,否则不做任何操作。整个比较和交换过程是一个原子操作。它通过硬件级别的原子指令实现了高效的无锁编程。
4.请你说说HashMap底层原理和扩容机制。
数组+链表 数组+链表/红黑树(JDK8以及之后,在链表长度>=8且数组长度≥64时时会变成红黑树。默认初始容量16,负载因子0.75当元素数目大于负载因子(0.75)×容量的时候,会发生扩容,扩容为原来的两倍,在jdk7之前要重新计算来确定位置,由于要么位置在原位置,要么在原位置+原数组长度,所以用哈希值与上原数组长度,如果为真,那么就在原位置+原数组长度,不然的话就不动。确定好在哈希桶的位置后,再尾插进对应的位置。
5.说说你了解的JVM内存模型
堆(存放对象实例)、方法区(存储类信息.JIT,运行时常量池) 虚拟机栈(线程私有方法调用)、本地方法栈(Native方法)和程序计数器(线程执行位置)。堆和方法区线程共享,栈和程序计数器线程私有,直接内存通过堆外分配管理。
6.介绍下双亲委派模型,如何打破它?
双亲委派模型是Java类加载机制,子类加载器先委托父类加载器尝试加载类,父类无法加载时才由自身加载,避免重复加载并保证核心类安全。 类加载器的层次结构:引导类加载器(Bootstrap ClassLoader),扩展类加载器(Extension ClassLoader),应用类加载(Application ClassLoader),自定义类加载器(Custom ClassLoader)
打破: (1)通过线程上下文类加载器(Thread Context ClassLoader) (2)重写loadClass方法,改变委托逻辑(如不先委托父类,直接自己加载)。 (3)OSGi的动态模块加载,通过Bundle类加载器打破双亲委派,每个模块(Bundle)有独立的类加载器。
#面试真题#记录刷过的面试真题
查看4道真题和解析