面试题答案
一键面试- 优化策略确保高效独立执行
- 并行流:
- 将集合转换为并行流,使用
parallelStream()
方法。例如:List<ComplexObject> list = ...; list.parallelStream().forEach(this::processObject);
并行流会将任务分解成多个子任务,利用多核CPU的优势,同时处理集合中的不同元素,提高处理速度。
- 将集合转换为并行流,使用
- 减少中间操作:
- 在Stream处理逻辑中,尽量减少不必要的中间操作。每一个中间操作(如
map
、filter
等)都会增加计算开销。例如,如果可以在单个方法中完成多个计算步骤,就不要拆分成多个中间操作。
- 在Stream处理逻辑中,尽量减少不必要的中间操作。每一个中间操作(如
- 批量处理外部资源访问:
- 如果处理逻辑涉及外部资源访问(如数据库查询、文件读取等),尽量批量处理。例如,不要为每个对象单独进行数据库查询,可以收集需要查询的条件,然后批量执行查询,减少资源访问的次数。
- 并行流:
- 处理资源竞争和数据一致性问题
- 线程安全的数据结构:
- 如果在处理过程中需要共享数据结构(如计数器、结果汇总的集合等),使用线程安全的数据结构。例如,使用
ConcurrentHashMap
代替普通的HashMap
,使用AtomicInteger
代替普通的int
类型的计数器。
- 如果在处理过程中需要共享数据结构(如计数器、结果汇总的集合等),使用线程安全的数据结构。例如,使用
- 锁机制:
- 对于关键资源(如文件写入、数据库连接池资源等),使用锁来控制访问。可以使用
synchronized
关键字或者ReentrantLock
。例如:
- 对于关键资源(如文件写入、数据库连接池资源等),使用锁来控制访问。可以使用
- 线程安全的数据结构:
private static final Object lock = new Object();
public void processObject(ComplexObject obj) {
synchronized (lock) {
// 访问共享资源的代码
}
}
- 不可变对象:
- 如果对象在处理过程中不需要被修改,可以将其设计为不可变对象。不可变对象天生线程安全,不会出现数据一致性问题。例如:
public final class ImmutableComplexObject {
private final int value1;
private final String value2;
public ImmutableComplexObject(int value1, String value2) {
this.value1 = value1;
this.value2 = value2;
}
// 只提供getter方法
public int getValue1() {
return value1;
}
public String getValue2() {
return value2;
}
}
- 线程本地存储(ThreadLocal):
- 如果处理逻辑中需要一些本地线程的变量(如每个线程独立的数据库连接副本等),可以使用
ThreadLocal
。例如:
- 如果处理逻辑中需要一些本地线程的变量(如每个线程独立的数据库连接副本等),可以使用
private static final ThreadLocal<Connection> connectionThreadLocal = ThreadLocal.withInitial(() -> {
// 创建数据库连接的逻辑
return DriverManager.getConnection(url, username, password);
});
然后在处理对象的方法中使用connectionThreadLocal.get()
获取每个线程独立的连接,避免资源竞争。