并发面试题汇总

参考:从我个人以往面试经历、博客、微信公众号搜集了并发相关的面试题,由于是从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的执行方式
对线程安全的理解
事务有哪些特性?
怎么理解原子性?

 

posted on 2020-11-23 17:01  秦羽的思考  阅读(307)  评论(0编辑  收藏  举报