本篇整理了 Java 并发编程中常见的的面试题,并结合实际案例进行解析,帮助读者深入理解并发编程的核心概念和常见问题。

线程基础

  1. 进程和线程的区别是什么?

进程是操作系统资源分配的基本单位,而线程是 CPU 调度的基本单位。一个进程可以包含多个线程,它们共享进程的资源,但拥有独立的程序计数器、栈空间等。

  1. 如何创建线程?

Java 中创建线程主要有两种方式:

* 继承 Thread 类,重写 run() 方法。

* 实现 Runnable 接口,实现 run() 方法。

  1. Thread 类中的 start() 和 run() 方法有什么区别?

start() 方法用于启动线程,并在新的线程中执行 run() 方法中的代码。直接调用 run() 方法则是在当前线程中执行代码,不会创建新的线程。

线程同步

  1. 什么是线程安全问题?

当多个线程访问共享资源时,如果不对访问进行同步控制,就可能导致数据不一致的问题,这就是线程安全问题。

  1. Java 中常用的同步机制有哪些?

  2. synchronized 关键字:可以用于同步代码块或方法。

  3. Lock 接口:提供了更灵活的锁机制,例如可重入锁、读写锁等。
  4. volatile 关键字:保证变量的可见性和有序性。
  5. 原子类:提供原子操作,例如 AtomicInteger、AtomicLong 等。

  6. 如何避免死锁?

  7. 避免循环等待:确保线程获取资源的顺序一致。

  8. 避免资源占用过多:尽量减少线程持有锁的时间。
  9. 使用超时机制:设置获取锁的超时时间,避免无限等待。

线程池

  1. 为什么要使用线程池?

  2. 降低资源消耗:重复利用已创建的线程,减少线程创建和销毁的开销。

  3. 提高响应速度:任务到达时可以立即执行,无需等待线程创建。
  4. 便于管理线程:线程池可以统一管理线程的生命周期、数量等。

  5. Java 中常用的线程池有哪些?

  6. newFixedThreadPool:创建固定数量线程的线程池。

  7. newCachedThreadPool:创建可缓存线程的线程池,线程空闲时会被回收。
  8. newScheduledThreadPool:创建支持定时任务的线程池。
  9. newSingleThreadExecutor:创建只有一个线程的线程池,确保任务按顺序执行。

  10. 线程池的工作原理是什么?

线程池维护一个任务队列和若干个工作线程。当有新任务提交时,线程池会将其放入队列中。工作线程从队列中获取任务并执行。

并发工具类

  1. CountDownLatch 的作用是什么?

CountDownLatch 用于线程间协作,允许一个或多个线程等待其他线程完成操作后再继续执行。

  1. Semaphore 的作用是什么?

Semaphore 用于控制并发访问的线程数量,例如限制对某个资源的访问。

  1. CyclicBarrier 的作用是什么?

CyclicBarrier 用于多个线程互相等待,直到所有线程都到达某个屏障点后再一起继续执行。

总结

并发编程是 Java 开发中的重要知识点,掌握并发编程的核心概念和常见问题对于提升代码质量和性能至关重要。