Java 并发编程面试题解析

线程基础

  1. 解释线程和进程的区别?

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

  1. Java 中如何创建线程?

  2. 继承 Thread 类

  3. 实现 Runnable 接口
  4. 使用 Callable 和 Future
  5. 使用线程池

  6. 线程的生命周期有哪些状态?

新建、就绪、运行、阻塞、死亡

线程同步

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

当多个线程访问共享资源,并且其中至少有一个线程会修改该资源时,就会出现线程安全问题。

  1. 如何解决线程安全问题?

  2. 同步代码块(synchronized)

  3. 使用锁机制(Lock)
  4. 使用原子类
  5. 使用并发容器

  6. synchronized 和 Lock 的区别?

  7. synchronized 是 Java 关键字,Lock 是接口

  8. synchronized 会自动释放锁,Lock 需要手动释放
  9. Lock 提供更灵活的锁操作,例如可重入锁、读写锁等

线程通信

  1. wait() 和 notify() 方法的作用?

  2. wait():使当前线程进入等待状态,并释放锁

  3. notify():唤醒一个正在等待该对象锁的线程

  4. 生产者消费者模型的实现方式?

使用阻塞队列(BlockingQueue)可以方便地实现生产者消费者模型。

线程池

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

  2. 降低资源消耗

  3. 提高响应速度
  4. 便于管理线程

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

  6. FixedThreadPool

  7. CachedThreadPool
  8. ScheduledThreadPool
  9. SingleThreadExecutor

并发工具类

  1. CountDownLatch 的作用?

允许一个或多个线程等待其他线程完成操作。

  1. CyclicBarrier 的作用?

允许一组线程互相等待,直到所有线程都到达某个屏障点。

  1. Semaphore 的作用?

用于控制同时访问特定资源的线程数量。