JUC面试题目攻略
JUC(Java Util Concurrent)是Java中用于并发编程的工具包,包含了许多用于多线程编程的类接口。在JUC面试中,常见的问题包括线程池、锁、原子类等。本攻略将详细介绍JUC面试题目的解答方法,并提供两个示例说明。
线程池
问题1:线程池的作用是什么?
答:线程池是一种用于管理程的机制,它可以在需要时创建线程,并在不需要时用线程。线程池可以提高程序的性能和可伸缩性,避免了频繁创建和销毁线程的开销。
问题2:线程池的核心参数有哪些?
答:线程池的核心参数包括:
- corePoolSize:线程池的核心线程数。
- maximumPoolSize:线程池的最大线程数。
- keepAliveTime:线程池中空闲线程的存活时间。
- workQueue:用于存储等待执行的任务的阻塞队列。
- threadFactory:用于创建新线程的工厂。
- handler:用于处理被拒绝的的处理器。
示例1:使用线程池执行任务
以下是一个使用线程池执行任务的示例代码:
ExecutorService executor = Executors.newFixedThreadPool(10);
for (int i = 0; i < 100; i++) {
executor.execute(() -> {
// 执行任务
});
}
executor.shutdown();
在上面的代码中,我们使用Executors.newFixedThreadPool()
方法创建一个固定大小的线程池,并使用execute()
方法提交100个任务。然后,我们使用shutdown()
方法关闭程池。
锁
问题1:什么是可重入锁?
答:可重入锁是一种支持重复获取锁的锁,也称为递归锁。当线程持有一个可重入锁时,它可以重复获取该锁而不会被阻塞。可重锁可以避免死锁和提高程序的性能。
问题2:什么是公平锁和非公平锁?
答:公平锁是一种按照线程请求的顺序来获取锁的锁,即先到先得。非公平锁是一种不按照线程请求的顺序来获取锁的锁,即先到不一定先得。公平锁可以避免线程饥饿,但会降低程序的性能。
示例2:使用可重入锁保证线程安全
以下是一个使用可重入锁保证线程安全的示例代码:
class MyService {
private ReentrantLock lock = new ReentrantLock();
public void doSomething() {
lock.lock();
try {
// 执行线程安全的操作
} finally {
lock.unlock();
}
}
}
在上面的代码中,我们使用ReentrantLock
类创建一个可重入锁,并在需要时获取锁并执行线程安全的操作。然后,我们使用unlock()
方法释放锁。
以上是关于JUC面试题目的完整攻略,包括线程池和锁的相关问题和示例说明。