共计 2324 个字符,预计需要花费 6 分钟才能阅读完成。
前言
众所周知,在 Java 的知识体系中,并发编程是非常重要的一环,也是面试的必问题,一个好的 Java 开发者是必须对并发编程这块有所了解的。
而如何在并发场景中写出优良的代码,是一道绕不开的坎,也是考量一个 Java 开发者功底的关键技术。因此,不难发现 Java
并发问题一直是各个大厂面试的重点之一,然而我发现很多候选人在面试时,常常表示对各种并发原理一脸懵逼,好像知道一些却又讲不清楚,最终导致面试失败。于是发奋学习,啃大部头书又发现理论太多,头疼。其实
Java 的并发问题虽然内容繁杂,然而整个脉络还是很清晰的。那么接下来,一起来看看面试中会问到哪些并发的知识点。
线程池相关问题
问题一:Java 中的线程池是如何实现的?
问题二:创建线程池的几个核心构造参数?
问题三:线程池中的线程是怎么创建的?是一开始就随着线程池的启动创建好的吗?
问题四:既然提到可以通过配置不同参数创建出不同的线程池,那么 Java 中默认实现好的线程池又有哪些呢?请比较它们的异同。
问题五:如何在 Java 线程池中提交线程?
线程安全和线程同步器相关问题
问题一:java 如何实现多线程之间的通讯和协作?
问题二:什么叫线程安全?servlet 是线程安全吗?
问题三:同步有几种实现方法?
问题四:volatile 有什么用?能否用一句话说明下 volatile 的应用场景?
问题五:请说明下 java 的内存模型及其工作流程。
问题六:为什么代码会重排序?
问题七:分析下 JUC 中倒数计数器 CountDownLatch 的使用与原理?
问题八:CountDownLatch 与线程的 Join 方法区别是什么?
问题九:讲讲对 JUC 中回环屏障 CyclicBarrier 的使用?
问题十:CyclicBarrier 内部的实现与 CountDownLatch 有何不同?
问题十一:Semaphore 的内部实现是怎样的?
问题十二:简单对比同步器实现,谈谈你的看法?
问题十三:并发组件 CopyOnWriteArrayList 是如何通过写时拷贝实现并发安全的 List?
内存模型相关问题
问题一:什么是 Java 的内存模型,Java 中各个线程是怎么彼此看到对方的变量的?
问题二:请谈谈 volatile 有什么特点,为什么它能保证变量对所有线程的可见性?
问题三:既然 volatile 能够保证线程间的变量可见性,是不是就意味着基于 volatile 变量的运算就是并发安全的?
问题四:请对比下 volatile 对比 Synchronized 的异同。
问题五:请谈谈 ThreadLocal 是怎么解决并发安全的?
问题六:很多人都说要慎用 ThreadLocal,谈谈你的理解,使用 ThreadLocal 需要注意些什么?
锁相关问题
问题一:什么是可重入锁、乐观锁、悲观锁、公平锁、非公平锁、独占锁、共享锁?
问题二:当一个线程进入某个对象的一个 synchronized 的实例方法后,其它线程是否可进入此对象的其它方法?
问题三:synchronized 和 java.util.concurrent.locks.Lock 的异同?
问题四:什么是锁消除和锁粗化?
问题五:乐观锁和悲观锁的理解及如何实现,有哪些实现方式?
问题六:如何实现乐观锁(CAS)?如何避免 ABA 问题?
问题七:读写锁可以用于什么应用场景?
问题八:什么是可重入性,为什么说 Synchronized 是可重入锁?
问题九:什么时候应该使用可重入锁?
问题十:什么场景下可以使用 volatile 替换 synchronized?
并发框架和并发队列相关问题
问题一:SynchronizedMap 和 ConcurrentHashMap 有什么区别?
问题二:CopyOnWriteArrayList 可以用于什么应用场景?
问题三:如何让一段程序并发的执行,并最终汇总结果?
问题四:任务非常多的时候,使用什么阻塞队列能获取最好的吞吐量?
问题五:如何使用阻塞队列实现一个生产者和消费者模型?
问题六:多读少写的场景应该使用哪个并发容器,为什么使用它?
问题七:谈下对基于链表的非阻塞无界队列 ConcurrentLinkedQueue 原理的理解?
问题八:ConcurrentLinkedQueue 内部是如何使用 CAS 非阻塞算法来保证多线程下入队出队操作的线程安全?
问题九:基于链表的阻塞队列 LinkedBlockingQueue 原理。
问题十:阻塞队列 LinkedBlockingQueue 内部是如何使用两个独占锁 ReentrantLock 以及对应的条件变量保证多线程先入队出队操作的线程安全?
问题十一:为什么不使用一把锁,使用两把为何能提高并发度?
问题十二:基于数组的阻塞队列 ArrayBlockingQueue 原理。
问题十三:ArrayBlockingQueue 内部如何基于一把独占锁以及对应的两个条件变量实现出入队操作的线程安全?
问题十四:谈谈对无界优先级队列 PriorityBlockingQueue 原理?
问题十五:PriorityBlockingQueue 内部使用堆算法保证每次出队都是优先级最高的元素,元素入队时候是如何建堆的,元素出队后如何调整堆的平衡的?
CountDownLatch 相关问题
问题一:介绍一下 CountDownLatch 工作原理?
问题二:CountDownLatch 和 CyclicBarrier 的区别?
问题三:CountDownLatch 的使用场景?
问题四:CountDownLatch 类中主要的方法?
最后
上述很多知识点都会在我的公众号《Java 技术 zhai》中涉及到,我会站在 理论、模型的角度 讲解 Java 并发,让你融汇贯通,形成 全面系统的并发编程知识体系。最终可以 得心应手地解决各种并发难题,同时将这些知识用于其他编程语言。