面试中关于 Java 并发编程的问题通常涉及线程安全、锁、并发工具类等方面。以下是一些常见的 Java 并发编程面试题:
-
什么是线程安全?如何实现线程安全?
- 线程安全是指多个线程访问共享数据时,不会出现数据不一致或者数据污染的情况。
- 实现线程安全的方式包括:使用 synchronized 关键字同步代码块或方法、使用 Lock 接口及其实现类进行加锁、使用并发容器(如 ConcurrentHashMap、CopyOnWriteArrayList 等)、使用原子类(如 AtomicInteger、AtomicReference 等)等。
-
什么是 Java 中的锁?请介绍常见的锁类型。
- 锁是用来控制多个线程对共享资源的访问的工具。
- 常见的锁类型包括:
- synchronized:Java 中的关键字,用于实现同步。
- ReentrantLock:Lock 接口的实现类,可重入锁,功能更强大,提供了更多灵活性。
- ReadWriteLock:读写锁,允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。
- StampedLock:引入乐观读锁的概念,可以提高读操作的性能。
-
什么是线程池?如何创建线程池?
- 线程池是一组线程的集合,可以有效地管理和复用线程,提高程序性能和资源利用率。
- 创建线程池可以使用 Executors 工厂类的静态方法,如
Executors.newFixedThreadPool(int n)
、Executors.newCachedThreadPool()
、Executors.newSingleThreadExecutor()
等。
-
什么是并发包中的 CountDownLatch?请描述其原理和用途。
- CountDownLatch是一种同步工具类,用于等待其他线程完成操作。
- 它通过一个计数器来实现,计数器的初始值为线程需要等待的操作数,每个操作完成后,计数器值减一。
- 当计数器值为 0 时,表示所有操作已完成,等待的线程可以继续执行。
-
什么是 Java 中的 volatile 关键字?有什么作用?
- volatile 是 Java 中的关键字,用于修饰变量。
- 它的作用是使变量在多个线程间可见,即当一个线程修改了变量的值后,其他线程能立即看到最新的值,避免了线程间的数据不一致问题。
- 使用 volatile 修饰的变量不会被缓存到线程的工作内存中,而是直接从主内存中读取和写入。
这些问题涉及了 Java 并发编程中的一些核心概念和常用工具,准备面试时可以针对性地复习和准备。