目录
1.5、线程有哪几种状态? 分别说明从一种状态到另一种状态转变有哪些方式?
2.2、Synchronized本质上是通过什么保证线程安全的?
2.3、Synchronized使得同时只有一个线程可以执行,性能比较差,有什么提升的方法?
2.4、Synchronized由什么样的缺陷? Java Lock是怎么弥补这些缺陷的?
2.7、Synchronized修饰的方法在抛出异常时,会释放锁吗?
2.8、多个线程等待同一个Synchronized锁的时候,JVM如何选择下一个获取锁的线程?
2.12、32位机器上共享的long和double变量的为什么要用volatile?
2.17、如何理解private所修饰的方法是隐式的final?
4.3、CAS使用示例,结合AtomicInteger给出示例?
4.8、AtomicStampedReference是怎么解决ABA的?
5.3、通过LockSupport的park/unpark实现同步?
5.4、Thread.sleep()、Object.wait()、Condition.await()、LockSupport.park()的区别? 重点
5.5、如果在wait()之前执行了notify()会怎样?
5.6、如果在park()之前执行了unpark()会怎样?
5.12、什么是可重入,什么是可重入锁? 它用来解决什么问题?
5.13、ReentrantLock的核心是AQS,那么它怎么来实现的,继承吗?
5.16、ReentrantLock默认实现的是公平还是非公平锁?
5.17、为了有了ReentrantLock还需要ReentrantReadWriteLock?
5.18、ReentrantReadWriteLock底层实现原理?
5.19、ReentrantReadWriteLock底层读写状态如何设计的?
5.21、本地线程计数器ThreadLocalHoldCounter是用来做什么的?
6.1、为什么HashTable慢? 它的并发度是什么? 那么ConcurrentHashMap并发度是什么?
6.2、ConcurrentHashMap在JDK1.7和JDK1.8中实现有什么差别? JDK1.8解決了JDK1.7中什么问题
6.3、ConcurrentHashMap JDK1.7实现的原理是什么?
6.4、ConcurrentHashMap JDK1.7中Segment数(concurrencyLevel)默认值是多少? 为何一旦初始化就不可再扩容?
6.5、ConcurrentHashMap JDK1.7说说其put的机制?
6.6、ConcurrentHashMap JDK1.7是如何扩容的?
6.7、ConcurrentHashMap JDK1.8实现的原理是什么?
6.8、ConcurrentHashMap JDK1.8是如何扩容的?
6.9、ConcurrentHashMap JDK1.8链表转红黑树的时机是什么? 临界值为什么是8?
6.10、ConcurrentHashMap JDK1.8是如何进行数据迁移的?
6.12、CopyOnWriteArrayList的实现原理?
6.14、CopyOnWriteArrayList为什么并发安全且性能比Vector好?
6.15、CopyOnWriteArrayList有何缺陷,说说其应用场景?
6.17、ConcurrentLinkedQueue实现的数据结构?
6.18、ConcurrentLinkedQueue底层原理?
6.19、ConcurrentLinkedQueue的核心方法有哪些?
6.20、说说ConcurrentLinkedQueue的HOPS(延迟更新的策略)的设计?
6.21、ConcurrentLinkedQueue适合什么样的使用场景?
6.22、什么是BlockingDeque? 适合用在什么样的场景?
6.26、什么是BlockingDeque? 适合用在什么样的场景?
6.27、BlockingDeque 与BlockingQueue有何关系,请对比下它们的方法?
7.1、FutureTask用来解决什么问题的? 为什么会出现?
7.6、Java是实现和管理线程池有哪些方式? 请简单举例如何使用。
7.8、ThreadPoolExecutor有哪些核心的配置参数? 请简要说明
7.9、ThreadPoolExecutor可以创建哪是哪三种线程池呢?
7.10、当队列满了并且worker的数量达到maxSize的时候,会怎么样?
7.11、说说ThreadPoolExecutor有哪些RejectedExecutionHandler策略? 默认是什么策略?
7.17、为什么很多公司不允许使用Executors去创建线程池? 那么推荐怎么使用呢?
7.18、ScheduledThreadPoolExecutor要解决什么样的问题?
7.19、ScheduledThreadPoolExecutor相比ThreadPoolExecutor有哪些特性?
7.20、ScheduledThreadPoolExecutor有什么样的数据结构,核心内部类和抽象类?
7.21、ScheduledThreadPoolExecutor有哪两个关闭策略? 区别是什么?
7.22、ScheduledThreadPoolExecutor中scheduleAtFixedRate 和 scheduleWithFixedDelay区别是什么?
7.23、为什么ThreadPoolExecutor 的调整策略却不适用于 ScheduledThreadPoolExecutor?
7.24、Executors 提供了几种方法来构造 ScheduledThreadPoolExecutor?
7.26、Fork/Join框架是在哪个JDK版本中引入的?
7.27、Fork/Join框架主要包含哪三个模块? 模块之间的关系是怎么样的?
7.30、整个Fork/Join 框架的执行流程/运行机制是怎么样的?
7.31、具体阐述Fork/Join的分治思想和work-stealing 实现方式?
7.33、如何使用Executors工具类创建ForkJoinPool?
7.34、写一个例子: 用ForkJoin方式实现1+2+3+...+100000?
7.35、Fork/Join在使用时有哪些注意事项? 结合JDK中的斐波那契数列实例具体说明。
8.5、写道题:实现一个容器,提供两个方法,add,size 写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束?
8.7、CountDownLatch和CyclicBarrier对比?
8.10、Semaphore常用方法有哪些? 如何实现线程同步和互斥的?
8.11、单独使用Semaphore是不会使用到AQS的条件队列?
8.12、Semaphore初始化有10个令牌,11个线程同时各调用1次acquire方法,会发生什么?
8.13、Semaphore初始化有10个令牌,一个线程重复调用11次acquire方法,会发生什么?
8.14、Semaphore初始化有1个令牌,1个线程调用一次acquire方法,然后调用两次release方法,之后另外一个线程调用acquire(2)方法,此线程能够获取到足够的令牌并继续运行吗?
8.15、Semaphore初始化有2个令牌,一个线程调用1次release方法,然后一次性获取3个令牌,会获取到吗?
8.17、Phaser与CyclicBarrier和CountDownLatch的区别是什么?
8.21、对比SynchronousQueue,为什么说Exchanger可被视为 SynchronousQueue 的双向形式?
8.22、Exchanger在不同的JDK版本中实现有什么差别?
8.24、什么是ThreadLocal? 用来解决什么问题的?
8.27、为什么ThreadLocal会造成内存泄露? 如何解决
致力于一个专栏将Java面试说的清清楚楚,从工作实践角度出发,尽量涵盖Java主流知识点,全面讲述Java面试题。
本篇讲述Java并发和多线程,总共涵盖8个知识点,161道热点面试题。
1、并发基础
1.1、多线程的出现是要解决什么问题的? 本质什么?
CPU、内存、I/O 设备的速度是有极大差异的,为了合理利用 CPU 的高性能,平衡这三者的速度差异,计算机体系结构、操作系统、编译程序都做出了贡献,主要体现为:
- CPU 增加了缓存,以均衡与内存的速度差异;// 导致可见性问题