java面试高频八股文
时间: 2025-02-10 16:03:58 浏览: 55
### Java 面试中的高频问题及答案
#### JMM (Java内存模型)
JVM 中定义了一种抽象的计算机——Java 虚拟机(JVM),它提供了加载、验证、执行应用程序的一套完整的机制。而 Java 内存模型(JMM)则是为了屏蔽掉各种硬件和操作系统的差异,从而实现让 Java 程序在各个平台下都能达到一致的内存访问效果[^1]。
- **Volatile关键字的作用**
`volatile` 是一种轻量级同步机制,在多线程环境下用于确保变量修改后的可见性和有序性。当一个共享变量被声明为 `volatile` 类型之后,不会被指令重排序优化,保证每次读取都是最新的值。这解决了由于缓存一致性带来的数据不同步的问题以及部分编译器优化所带来的隐患。
- **Synchronized 和 Volatile 的区别**
`synchronized` 主要解决的是原子性的资源竞争问题;它可以修饰方法或代码块来控制多个线程对同一资源的竞争使用情况。相比之下,`volatile` 只能作用于变量级别上,并且只提供可见性和一定程度上的顺序保障而不涉及锁的概念。因此两者适用场景有所不同:
- 当需要保护整个临界区内的操作时应优先考虑采用 `synchronized`;
- 如果只是简单地希望某个特定字段能够及时更新并保持最新状态,则可以选用 `volatile` 来标记该成员变量。
#### 多线程相关概念
##### 线程的状态转换
线程在其生命周期中有五种基本状态:新建(New)、可运行(Runnable)、阻塞(Blocked)、等待(Waiting)/计时等待(Timed Waiting)、终止(Terminated)[^3]。
- 新建态是指刚创建了一个新的 Thread 对象但是还没有启动;
- 就绪态表示已经准备好随时被执行,正在等待 CPU 时间片分配给它去执行 run 方法里的逻辑;
- 运行态意味着当前正占用着处理器核心来进行计算工作;
- 阻塞/等待态指的是因为某些原因暂时无法继续前进下去,比如 I/O 操作未完成或是加入了 wait() 函数暂停自己直到收到通知为止;
- 死亡态即完成了所有的任务或者是遇到了异常退出了程序流程。
##### 获取多线程返回值的方法
对于有返回结果的需求来说,可以通过 Callable 接口配合 FutureTask 实现异步回调功能。具体做法是先实例化实现了 Callable<T> 接口的对象再将其封装到 FutureTask 容器当中传入目标线程内部作为参数传递过去。最后在线程外部调用 get 方法就可以拿到最终运算出来的 T 型泛型对象了。
```java
// 创建Callable接口匿名子类
Callable<Integer> task = () -> {
int sum = 0;
for(int i=1;i<=100;i++){
sum += i;
}
return sum;
};
// 使用FutureTask包装上述task
FutureTask<Integer> futureTask = new FutureTask<>(task);
// 启动新线程执行futureTask所代表的任务
new Thread(futureTask).start();
try{
// 获取计算结果
System.out.println("Sum is " + futureTask.get());
}catch(Exception e){
e.printStackTrace();
}
```
阅读全文
相关推荐


















