封面
版权信息
版权
内容提要
前言
第1章 并发原理和线程安全
1.1 面试官:谈谈你对线程和线程安全的理解
1.1.1 Java创建和启动线程的方式有哪些?它们之间有什么区别?
1.1.2 Java线程都有哪些状态?其状态是如何切换的?
1.1.3 Java线程使用到了哪些调度策略?
1.1.4 为什么使用并发编程?需注意哪些问题?
1.1.5 并发编程和并行编程有什么区别?
1.1.6 什么是线程同步和阻塞?它们有什么关系?
1.1.7 什么是线程安全?如何确保线程安全?
1.2 面试官:介绍JMM与线程安全的关系
1.2.1 什么是JMM?它有哪些特征和作用?
1.2.2 JMM和Java内存结构有什么区别?
1.2.3 JMM内存是如何交互的?都有哪些操作?
1.2.4 什么是happens-before原则?它有什么作用?
1.2.5 什么是指令重排序和内存屏障?
1.2.6 如何保证程序的可见性、原子性和有序性?
1.3 面试官:谈谈多线程中的上下文切换
1.3.1 什么是上下文切换?上下文切换会带来哪些问题?
1.3.2 什么是进程上下文切换?引起进程上下文切换的原因有哪些?
1.3.3 什么是线程上下文切换?与进程上下文切换有何区别?
1.3.4 如何查看线程上下文切换信息?
1.3.5 如何减少线程上下文切换的次数?
1.4 面试官:谈谈你对AQS的理解
1.4.1 什么是AQS?它有什么作用?
1.4.2 AQS支持哪些资源共享方式?
1.4.3 AQS的底层数据结构和工作原理是什么?
1.4.4 什么是Condition?它有哪些使用场景?
1.4.5 AQS中的Condition是如何实现的?
1.5 面试官:讲讲CAS实现机制和原理
1.5.1 什么是CAS?它有什么作用?
1.5.2 Java中有哪些CAS工具?如何使用它们?
1.5.3 Unsafe类和CAS有什么关系?
1.5.4 使用CAS会产生什么问题?如何解决这些问题?
第2章 并发关键字原理
2.1 面试官:谈谈final关键字对并发编程的作用
2.1.1 final关键字的底层原理是什么?
2.1.2 final关键字对并发编程有什么作用?
2.1.3 为什么final引用不能从构造函数内“逸出”?
2.2 面试官:谈谈synchronized关键字的特性和原理
2.2.1 synchronized关键字的底层实现原理是什么?
2.2.2 synchronized关键字是怎么保证线程安全的?
2.2.3 synchronized是可重入锁吗?其底层如何实现?
2.2.4 Java对synchronized关键字做了哪些优化?
2.2.5 说说synchronized锁升级过程及实现原理
2.2.6 什么是synchronized锁消除和锁粗化?
2.3 面试官:说说volatile关键字的使用及原理
2.3.1 volatile关键字的使用场景有哪些?
2.3.2 volatile关键字如何做到内存可见性?
2.3.3 volatile关键字如何实现禁止指令重排序?
2.3.4 volatile变量的内存屏障插入策略是什么?
2.3.5 volatile关键字能保证操作的原子性吗?
2.3.6 双重检查锁为什么要使用volatile关键字?
2.3.7 volatile和synchronized关键字有什么区别?
第3章 并发锁和死锁
3.1 面试官:谈谈Java并发锁的使用和原理
3.1.1 Java都有哪些锁?它们有什么区别?
3.1.2 乐观锁和悲观锁的应用和原理有什么区别?
3.1.3 乐观锁如何解决ABA问题?
3.1.4 在Java中如何应用读锁和写锁?
3.1.5 Java独享锁和共享锁有何区别?
3.1.6 偏向锁、轻量级锁、重量级锁是什么?
3.1.7 什么是公平锁?什么是非公平锁?
3.1.8 分段锁的设计思想和目的是什么?
3.1.9 什么是可重入锁?其实现原理是什么?
3.1.10 什么是自旋锁?它有哪些实现方式?
3.1.11 常用的锁优化手段和方法有哪些?
3.2 面试官:如何预防和解决多线程死锁?
3.2.1 什么是线程死锁?其产生原因有哪些?
3.2.2 如何避免和解决线程死锁?
3.2.3 如何分析和定位死锁问题源头?
3.2.4 什么是饥饿和活锁?它们与死锁有什么区别?
3.2.5 什么是锁的分级?如何使用它预防死锁?
3.2.6 Java并发API有哪些高级特性可用于避免死锁?
第4章 并发容器和工具
4.1 面试官:谈谈你对JUC的理解
4.1.1 什么是JUC?它包含哪些内容?
4.1.2 什么是原子类?它有哪些作用和优点?
4.1.3 Lock框架有哪些常用的锁?它们有什么优缺点?
4.1.4 常用的并发容器有哪些?适用于哪些场景?
4.1.5 同步容器与并发容器有什么区别?
4.1.6 JUC包含哪些同步工具类?有什么作用?
4.2 面试官:谈谈JUC容器的实现原理
4.2.1 ConcurrentHashMap的底层存储结构是什么?
4.2.2 ConcurrentHashMap如何保证线程安全?
4.2.3 ConcurrentHashMap如何实现扩容?
4.2.4 在ConcurrentHashMap中什么情况下链表会转换为红黑树?
4.2.5 什么是Copy-on-Write?常见的CopyOnWrite容器有哪些?
4.2.6 CopyOnWriteArrayList是如何保证线程安全的?
4.3 面试官:谈谈你对并发队列的理解
4.3.1 BlockingQueue和BlockingDeque有什么区别?
4.3.2 BlockingQueue阻塞队列的实现原理是什么?
4.3.3 ArrayBlockingQueue和LinkedBlockingQueue有什么区别?
4.3.4 SynchronousQueue底层有几种数据结构?有什么区别?
4.3.5 ConcurrentLinkedQueue是如何保证线程安全的?
4.4 面试官:介绍JUC同步工具的使用及实现原理
4.4.1 CountDownLatch如何使用?其实现原理是什么?
4.4.2 CyclicBarrier和CountDownLatch有什么区别?
4.4.3 使用Semaphore需注意哪些问题?其底层如何实现?
4.4.4 Exchanger主要解决什么问题?实现机制是什么?
4.5 面试官:谈谈你对ThreadLocal的理解
4.5.1 工作中遇到过哪些ThreadLocal的使用场景?
4.5.2 ThreadLocal底层是如何实现线程隔离的?
4.5.3 为什么ThreadLocal会导致内存泄漏?如何解决?
第5章 并发线程池
5.1 面试官:说说线程池的设计思想和实现原理
5.1.1 什么是线程池?它有哪些适用场景?
5.1.2 线程池有哪些状态?这些状态如何转换?
5.1.3 线程池主要有哪些参数?它们有什么作用?
5.1.4 核心线程和非核心线程有什么区别?
5.1.5 Java线程池的线程复用原理是什么?
5.1.6 线程池是如何进行任务调度的?
5.1.7 线程池为什么要使用阻塞队列?
5.1.8 Java线程池的底层实现原理是什么?
5.2 面试官:谈谈你使用Java线程池的一些经验
5.2.1 Java有哪些类型的线程池?它们各自适用于什么场景?
5.2.2 为什么不推荐使用Executors创建线程池?
5.2.3 如何合理配置Java线程池的参数?
5.2.4 Java线程池线程抛出的异常该如何处理?
5.2.5 如何优雅且安全地关闭一个线程池?
5.2.6 如何监控和优化线程池的性能?
第6章 并发设计与实战
6.1 面试官:讲讲并发编程中有哪些常用的线程操作
6.1.1 如何正确处理一个线程发生的异常?
6.1.2 如何正确停止一个正在运行的线程?
6.1.3 如何唤醒一个阻塞的线程?
6.1.4 如何保证多个线程的执行顺序?
6.1.5 如何在两个线程之间共享数据?
6.1.6 怎么检查一个线程是否持有某个对象锁?
6.2 面试官:谈谈并发编程中的一些设计实践和经验
6.2.1 如何解决单例模式的线程安全问题?
6.2.2 如何使用阻塞队列来实现生产者-消费者模型?
6.2.3 如何使用AQS实现互斥锁?
6.2.4 怎样设计一个线程池?
6.2.5 设计一个并发系统,如何确保系统不会出现死锁?
更新时间:2025-03-13 18:04:16