interview
java-concurrency
你使用过哪些 Java 并发工具类

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();
}

用途

Java 并发工具类的面试问题旨在评估候选人处理并发编程的能力,这在高并发、高性能的生产环境中尤为重要。使用这些工具类可以提高程序的执行效率、资源利用率,并保证线程安全,从而避免竞态条件和死锁等问题。这些工具类在多线程服务器、实时数据处理系统、大规模并行计算等场景中广泛应用。\n

相关问题

🦆
什么是 BlockingQueue?有哪些实现类?

BlockingQueue 是一个支持两个附加操作的队列,这两个操作分别是:当队列为空时,获取元素的线程会等待队列变为非空;当队列为满时,存储元素的线程会等待队列可用。常见实现类有 ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue、DelayQueue、SynchronousQueue 等。

🦆
请解释 ConcurrentHashMap 的工作原理.

ConcurrentHashMap 是一个线程安全的哈希表,它通过分段锁机制实现高效的并发操作。整个哈希表被分成多个段,每个段有独立的锁,多个线程可以并发访问不同段中的数据,从而提高并发性能。Java 8 引入了 CAS 和内部分段减少的方式,进一步提高了效率。

🦆
什么是 Semaphore?请解释其使用场景.

Semaphore 是一个计数信号量,用于控制同时访问某一特定资源的操作数量。常见使用场景包括限制数据库连接池中的连接数量、控制对某一资源的并发访问、实现某种限流机制等。


Semaphore semaphore = new Semaphore(3);
semaphore.acquire();
try {
    // 访问受限资源
} finally {
    semaphore.release();
}

🦆
什么是 Future 和 CompletableFuture?

Future 代表一个异步计算的结果,通过调用其 get() 方法可以获取计算结果。CompletableFuture 是 Future 的增强版本,支持更多的异步任务编排和组合,如 thenApply、thenAccept、thenCompose 等方法,使得处理复杂的异步流更加方便。


CompletableFuture.supplyAsync(() -> {
    // 异步任务
}).thenApply(result -> {
    // 处理结果
});