参考:从我个人以往面试经历、博客、微信公众号搜集了并发相关的面试题,由于是从2年前开陆续始整理的,所以没法给出原文的出处,请原作者谅解
集合框架
HashMap,HashTable,ConcurrentHashMap、TreeMap的源码,实现原理、区别、底层数据结构、1.7和1.8的实现
JDK8中对HashMap做了怎样的优化。HaspMap扩容是怎样扩容的,为什么都是2的N次幂的大小;HashMap在高并发下如果没有处理线程安全会有怎样的安全隐患,具体表现是什么。
HashMap怎么解决碰撞问题的?hash冲突解决办法; HashMap的key可以重复吗?HashMap何时扩容,扩容的算法是什么?hashcode相等两个类一定相等吗?equals呢?相反呢?
hashmap和treemap【红黑树】什么区别?低层数据结构是什么?
hashMap什么情况下会出现循环链表?concurrentHashMap写的时候用什么锁?
极高并发下HashTable和ConcurrentHashMap哪个性能更好,为什么,如何实现的;ConcurrentHashMap加锁机制是什么,详细说一下?
这些数据结构中是线程安全的吗?假如你回答HashMap不是线程安全的,接着问你有没有线程安全的map,接下来问了conurren包。
什么时候使用Linkedhashmap【链表,迭代访问快】、Concurrenthashmap、Weakhashmap【方便GC】 哪些集合类是线程安全的
Concurrenthashmap的实现,1.7和1.8的实现;Java中ConcurrentHashMap的并发度是什么?
Java中的同步集合与并发集合有什么区别?
jdk1.8对ConcurrentHashMap做了哪些优化?
讲一下 concurrentHashMap 原理。头插法还是尾插法?扩容怎么做?
讲讲hashmap,提到了红黑树,又问红黑树是什么。
答:HashMap在JDK8中有些优化,当某个桶链表长度>=8,则把该链表转换成红黑树,提高查询效率;红黑树是平衡二叉排序树,查询效率稳定O(lgn)
简单介绍下 ArrayList 怎么实现,加操作、取值操作,什么时候扩容?
ArrayList 和LinkedList的区别:java集合类相关的东西
(1)arraylist底层是数组,LinkedList是链表。
(2)由于底层实现的原因,ArrayList随机取数可以用下标获取,速度很快,尾部插入数据也较快。(扩容的时候除外,因为扩容可能会触发数组的重新拷贝分配内存)
(3)LinkedList因为是一个双向链表,所以是有序的,在任意位置的数据插入较快,随机但是随机取数比较慢。
集合在迭代的过程中,插入或删除数据会怎样?
线程池
线程池底层如何实现的?
线程池的参数有哪些,在线程池创建一个线程的过程?一个任务从被提交到被执行,线程池做了哪些工作?
线程池内的线程如果全部忙,提交一个新的任务,会发生什么?队列全部塞满了之后,还是忙,再提交会发生什么?
ExecutorService的用法?有什么好处?Executors工具类有哪几种构造线程池的方法?
Java中的线程池共有几种?
shutdown和shutdownnow的区别
常用的线程池模式以及不同线程池的使用场景
线程池参数,每个参数的作用,几种不同线程池的比较,阻塞队列的使用,拒绝策略
如何实现一个定时调度和循环调度的工具类。但提交任务处理不过来的时候,拒绝机制应该如何处理 ; 线程池默认有哪几种拒绝机制 ;
线程池coreSize,maxSize怎么设置,依据是什么?
场景1:单台机器4核,服务A请求时间为5S,但是A调用的某个服务B耗时4.98S,A服务超时时间是10S,问100QPS的访问量,动态线程池CoreSize,maxSize,等待队列怎么指定?
线程池了解吗?两个提交方法一个是submit一个是execute,有什么区别?
线程池的线程数怎么确定?
如果是IO操作为主怎么确定?
如果计算型操作又怎么确定?
线程池的线程是不是必须手动remove才可以回收value?那你说的内存泄漏是指主线程还是线程池?
怎么创建一个线程池,传入的参数分别什么含义?线程池是怎么实现维持核心线程数的?怎么实现一个自定义的拒绝策略?
线程池的构造类的方法的5个参数的具体意义?
单机上一个线程池正在处理服务如果忽然断电该怎么办?(正在处理和阻塞队列里的请求怎么处理)?
使用无界阻塞队列会出现什么问题?
ThreadPoolExcutor原理。
服务器CPU数量及线程池数量的关系?
锁
Volatil关键字;volitile关键字的作用,原理;volatile重排序举例
synchronized关键字的用法,优缺点;
Lock接口有哪些实现类,使用场景是什么。ReadWriteLock
可重入锁的用处及实现原理,写时复制的过程,读写锁,分段锁(ConcurrentHashMap中的segment)。
悲观锁,乐观锁,优缺点,CAS有什么缺陷,该如何解决。
多个线程同时读写,读线程的数量远远?于写线程,你认为应该如何解决并发的问题?你会选择加什么样的锁?ReadWriteLock CopyOnWrite
除了synchronized关键字之外,你是怎么来保障线程安全的?
什么时候需要加volatile关键字?它能保证线程安全吗?:只有单线程更新变量;对变量的写入操作不依赖变量的当前值。
synchronized关键字锁住的是什么?在字节码中是怎么表示的?在内存中的对象上表现为什么?
synchronized 和 ReentrantLock 有什么不同?
简述synchronized?Object的Monitor机制;
volatile和synchronized区别;synchronized和lock的区别?
Java中的volatile 变量是什么?
如何避免死锁?死锁代码实现
Java中活锁和死锁有什么区别?
乐观锁和悲观锁的实现
synchronized实现原理
sychnized和Lock什么区别?sychnize 什么情况情况是对象锁? 什么时候是全局锁
volitile的工作原理?
volatile的使用 synchronied的使用
reentrantlock的实现和Synchronied的区别
synchronized内部实现,偏向锁,轻量锁,重量锁 ;为什么需要自旋?
轻量级一点的锁了解吗?
答:就讲了讲乐观锁和项目应用。后来问自旋锁作用,然后又问我Java中的cas。
Unsafe类中有些Native方法,比如compareAndSwapLong,能保证原子性更新变量的值,
JMM
简述happen-before规则 ;
JMM内存模型
原子性,可见性,有序性如何保证
工作内存与主内存
在多核CPU下,可见性怎么保证?
堆是怎么存储的,插入是在哪里?
CAS
CAS的实现原理以及问题 AQS的实现原理 cas操作的使用;cas知道吗如何实现的?
Atomic包的实现原理是什么 ;CAS又是怎么保证原子性的 ;
CAS和锁的区别,以及应用场景。
concurrent包
ThreadLocal的了解,实现原理。ThreadLocal 是什么底层如何实现?写一个例子呗?
Java中CyclicBarrier 和 CountDownLatch有什么不同?
什么时候使用CopyOnArrayList
说说你了解的一个线程安全队列;阻塞队列的实现方式
简述AQS原理;AQS 有那些实现?
保证线程安全的解决方法有哪些?说一说读写锁吧,读写锁的读
并发包了解吗?假如几个线程之间相互等待,可以用哪个并发类来实现,他的原理是什么?多个线程执行完了,再执行一个线程,实现方式
Thread、Runnable、ThreadPool、CyclicBarrier、CountDownLatch、Semaphore、 ThreadLocal
讲一下CountDownLatch和cyclicBarrier的区别?
threadLocal关键字有用过吗?如果没有重写initialValue方法就直接get会怎样?
手写生产者消费者代码。
使用concurrent包下的来实现生产者消费者。
其他
Java实现多线程有哪几种方式。Callable和Future的了解。
ABC三个线程如何保证顺序执行。线程的状态都有哪些。
sleep和wait的区别。notify和notifyall的区别。
JAVA的AQS是否了解
wait/notify/notifyAll?需不需要被包含在synchronized块中?这是为什么?
生产者消费者代码实现
什么是线程?
线程和进程有什么区别?
如何在Java中实现线程?用Runnable还是Thread?
Thread 类中的start() 和 run() 方法有什么区别?两次start同一个线程会怎么样?
如何在Java中创建Immutable对象
单例模式的双检锁是什么?手写线程安全的单例模式
写出3条你遵循的多线程最佳实践
Future和ListenableFuture 异步回调
传统JDK中的Future通过异步的方式计算返回结果:在多线程运算中可能在没有结束返回结果,Future是运行中的多线程的一个引用句柄,确保在服务执行返回一个Result。
ListenableFuture可以允许你注册回调方法(callbacks),在运算(多线程执行)完成的时候进行调用, 或者在运算(多线程执行)完成后立即执行。
JUC和Object ; Monitor机制区别?
简述DCL失效原因,解决方法 ;
创建线程的方式:延伸至优劣,底层实现
(1)Runnable接口。
(2)继承Thead类。
(3)实现Callable接口。
(4)线程池获取:ThreadPoolExecutor.
怎么控制多个线程按序执行?
进程和线程的区别?并行和并发的区别?了解协程么?
进程间如何通信:进程 A 想读取进程 B 的主存怎么办?线程间通信?
线程的生命周期有哪些状态?怎么转换?
wait 和 sleep 有什么区别?什么情况下会用到 sleep?
怎么停止线程?
CPU的执行方式
对线程安全的理解
事务有哪些特性?
怎么理解原子性?