Java 并发面试题, 你使用过哪些 Java 并发工具类?
Java 并发面试题, 你使用过哪些 Java 并发工具类?
QA
Step 1
Q:: 你使用过哪些 Java 并发工具类?
A:: 常用的 Java 并发工具类包括:
1. java.util.
concurrent 包下的工具类,比如 ExecutorService、Future、CountDownLatch、CyclicBarrier、Semaphore、BlockingQueue、ConcurrentHashMap 等。
2.
原子类(Atomic classes),如 AtomicInteger、AtomicLong、AtomicReference 等。
3.
Lock 接口及其实现类,如 ReentrantLock、ReadWriteLock、StampedLock 等。
4.
并发集合,如 ConcurrentHashMap、ConcurrentLinkedQueue、ConcurrentLinkedDeque 等。
Step 2
Q:: 什么是 ExecutorService?如何使用它?
A:: ExecutorService 是一个接口,用于管理和控制一组异步任务的执行。它提供了一种将任务提交与执行分离的机制。通过调用其 submit()
方法,可以提交 Callable 或 Runnable 任务,ExecutorService 会管理线程池并调度这些任务。使用示例如下:
ExecutorService executor = Executors.newFixedThreadPool(10);
Future<Integer> future = executor.submit(() -> {
// 任务代码
return 123;
});
Integer result = future.get();
executor.shutdown();
Step 3
Q:: 什么是 CountDownLatch?请解释其工作原理。
A:: CountDownLatch 是一个同步工具类,用来使一个线程等待其他线程各自执行完毕后再继续执行。CountDownLatch 由一个计数器构造,该计数器的初始值由线程数设定。每当一个线程完成了自己的任务后,计数器的值就会减 1。CountDownLatch.await() 方法使得当前线程进入等待状态,直到计数器的值为 0
。
CountDownLatch latch = new CountDownLatch(3);
new Thread(() -> {
// 任务代码
latch.countDown();
}).start();
latch.await(); // 主线程等待
Step 4
Q:: 什么是 CyclicBarrier?请解释其工作原理。
A:: CyclicBarrier 是一个同步工具类,允许一组线程互相等待,直到所有线程都到达某个公共屏障点(barrier)。CyclicBarrier 可以循环使用,即当所有线程都到达屏障点后,屏障会重置以便下次使用。
CyclicBarrier barrier = new CyclicBarrier(3, () -> {
// 所有线程到达屏障后的动作
});
for (int i = 0; i < 3; i++) {
new Thread(() -> {
// 任务代码
barrier.await();
}).start();
}
Step 5
Q:: 什么是 ReentrantLock?它与 synchronized 关键字有什么区别?
A:: ReentrantLock 是 Lock 接口的一个实现类,提供了与 synchronized 关键字类似的同步功能,但它更灵活。主要区别包括:
1.
ReentrantLock 提供了更精细的线程控制,例如可中断锁申请、超时锁申请、尝试锁申请等。
2.
ReentrantLock 提供了一个公平锁选项,按申请顺序分配锁。
3.
ReentrantLock 提供了 Condition 对象,支持多个等待队列。
使用示例如下:
ReentrantLock lock = new ReentrantLock();
lock.lock();
try {
// 任务代码
} finally {
lock.unlock();
}