Java多线程面试精华:从基础到高级问题解析

需积分: 9 1 下载量 120 浏览量 更新于2024-07-17 收藏 118KB DOCX 举报
Java线程面试汇总文档提供了全面深入的Java多线程知识点,涵盖了线程概念、线程安全与不安全、同步机制以及Java并发库的关键组件。以下是对这些主题的详细阐述: 1. **线程**:在Java中,线程是程序执行的基本单元,它代表了程序中的并发执行流。通过继承`Thread`类或实现`Runnable`接口,可以创建和管理线程。 2. **线程安全与线程不安全**:线程安全意味着一个对象在多线程环境下的访问不会导致数据不一致。反之,线程不安全可能导致数据竞争或并发问题。理解何时选择同步机制以确保线程安全至关重要。 3. **自旋锁**:自旋锁是一种低开销的同步原语,当线程请求锁时,会一直循环检查锁是否可用,直到获得。这可能导致CPU忙等待,因此在高并发场景下需谨慎使用。 4. **Java内存模型**:Java内存模型规定了线程间共享变量的可见性规则,保证了多线程环境下的数据一致性。 5. **CAS(Compare and Swap)**:一种无锁数据结构的操作,用于原子地更新共享变量,减少锁的使用,提高并发性能。 6. **乐观锁与悲观锁**:乐观锁假设大部分操作都是成功的,仅在修改后检查冲突;悲观锁则假设操作可能失败,总是先锁定再操作,降低了并发性能。 7. **AQS(AbstractQueuedSynchronizer)**:Java并发包中的抽象同步器,许多高级同步组件如`Semaphore`、`Lock`等都是基于其构建的。 8. **原子操作与Java并发API的原子类**:原子操作是不可分割的,不会被中断的操作,如`AtomicInteger`、`AtomicLong`等提供了一组原子操作方法。 9. **Executors框架**:Java提供的线程管理工具,用于创建线程池,管理和调度任务,包括`ExecutorService`和`ThreadPoolExecutor`等。 10. **阻塞队列与生产者-消费者模型**:用于线程间通信的数据结构,如`BlockingQueue`,在生产者和消费者之间协调资源的分配和消耗。 11. **Callable和Future/FutureTask**:`Callable`允许异步计算,并返回结果,`FutureTask`包装了`Callable`的执行结果和异常处理,`Future`接口用于检索任务的结果。 12. **同步容器与并发容器**:如`synchronized`用于方法或代码块级别同步,而`ConcurrentHashMap`是线程安全的并发哈希表。 13. **多线程的优势与缺点**:提高系统响应速度,但也可能带来线程间通信开销、死锁和资源争抢等问题。 14. **上下文切换**:操作系统在不同线程之间切换执行所需的时间,会影响系统的性能。 15. **ThreadLocal**:设计用于每个线程拥有独立的局部变量副本,避免全局变量竞争。 16. **线程池与优势**:复用线程资源,降低创建和销毁线程的成本,支持可配置的线程数量和任务队列。 17. **Concurrent包中的其他工具**:如`ArrayBlockingQueue`、`CountDownLatch`等,分别用于阻塞队列和同步计数器。 18. **synchronized与ReentrantLock**:前者是语言内置的同步机制,后者更灵活,提供了更细粒度的控制。 19. **Semaphore**:用于控制同时访问某个资源的线程数量,防止过度使用。 20. **Lock接口与同步优势**:`Lock`提供了更强大的同步功能,如条件变量和可中断锁,相比`synchronized`更易于理解和调试。 21. **`Hashtable`的size()`方法**:即使只有一个操作,也需要同步,以确保线程安全。 22. **ConcurrentHashMap并发度**:内部采用分段锁设计,能有效提高并发性能。 23. **ReentrantReadWriteLock读写锁**:用于读多写少的场景,提高并发性能。 24. **CyclicBarrier和CountDownLatch**:用于线程同步,CyclicBarrier在所有线程到达特定点后再继续,CountDownLatch只有一个计数器,一旦减为零,所有等待线程继续。 25. **LockSupport工具**:提供与线程状态相关的操作,如唤醒睡眠的线程、打断线程等。 26. **Condition接口**:与`Lock`配合,允许更复杂的线程交互和同步条件。 27. **Fork/Join框架**:基于工作分治思想,用于并行任务分解和合并。 28. **`wait()`和`sleep()`的区别**:`wait()`释放锁并挂起,`sleep()`只是让当前线程休眠,不释放锁。 29. **线程五种状态**:创建(新建)、就绪(可运行)、运行(执行中)、阻塞(等待资源)和死亡(终止)。 30. **`start()`与`run()`方法**:`start()`启动新线程,`run()`方法是线程体。 31. **Runnable与Callable接口**:`Runnable`无返回值,`Callable`有返回值,适合任务需要结果的场景。 32. **Volatile关键字**:保证变量对所有线程的可见性,常用于多线程间的同步。 33. **获取线程dump文件**:用于分析线程状态,通常在出现异常或性能问题时使用。 34. **线程与进程的区别**:线程是进程的一部分,进程有自己的独立资源,线程共享进程资源。 35. **线程实现方式**:四种主要方式:继承`Thread`、实现`Runnable`、使用匿名内部类和静态工厂方法创建`Thread`。 36. **线程池应用策略**: - 高并发、短任务:使用固定大小的线程池,充分利用CPU核心; - 并发不高、长任务:按需创建线程,避免频繁创建和销毁; - 并发高、长任务:使用线程池大小动态调整或限流,保证任务顺序执行。 37. **线程池队列满时**:任务会被阻塞,直到有线程空闲或线程池大小扩大。 38. **锁的等级**:从低到高包括方法锁、实例锁和类锁,影响锁的竞争范围。 39. **同步块内异常处理**:如果线程抛出异常,取决于异常处理机制,可能中断同步,也可能导致其他线程看到不一致的状态。 40. **并发编程与并行编程**:并发编程关注共享资源的同步,而并行编程侧重于多个任务同时执行,通常不共享状态。
2023-06-10 上传