我的技术博客:www.zhenganwen.topjava
上午坐在图书馆前草坪的椅子上看《Netty权威指南》,差很少到了饭点,正准备起身去食堂吃饭,这时迎来一个突如其来的电话,上面显示:“浙江-杭州”。(所以前并未约面试,不知这就是阿里巴巴菜鸟网络的面试电话)mysql
Solr
作的,可是当时的项目用的是SpringBoot
,以前学Solr的时候是用Solr
是和Spring
整合,我用SpringBoot
集成Solr
发现版本差别很大,API也不用了,而后Solr
初始配置繁琐,当时就想换一个搜索框架。而后我据说Elasticsearch
挺好用的,因而就从0开始研究它的API,最后实现了商品搜索必需的一些功能,如关键字检索、结果高亮、聚合等。虽然我对ES的底层了解很少,但这一次是我独立对一个陌生框架的学习并实现了须要的基本功能。在本身的简历中写一些不知底层原理没有读过源码的花里胡哨的框架技术等于给本身埋坑面试
Java的源码有没有看过?redis
那你给我讲一下ConcurrentHashMap
和HashMap
的区别。算法
ConcurrentHashMap
的核心思想就是下降锁粒度以提升并发性能。HashMap
不是线程安全的,HashTable
虽然是线程安全的,但其相对于HashMap
来讲,只是简单地将每一个访问集合的方法都加了一个synchronized
关键字,也就是说任何访问集合的线程都须要先获取集合对象对应的锁,这样的话同一时刻只能有一个线程操做Map,并发性能弱,若是并发线程较多还会引发屡次上下文切换。而ConcurrentHashMap
采用锁分段的技术,默认在集合内部维护了16把锁,每几个Bucket
做为一个组,每一个组对应一把锁,这样最多就能支持16个线程同时访问Map了。每一个Bucket对应一把锁是吧?sql
HashMap
在并发场景下,它不安全的点是哪里?缓存
仔细说一下造成环形链表的过程。(解析参考)安全
HashMap
在元素个数到达阀值(容量x复杂引子)后会进行扩容,首先新建一个扩容后的空Map,而后遍历Entry将其Rehash到新的Map上。Rehash(对应方法transfer
)中有一行代码是Entry next = e.next
,其中e
是当前遍历到的Entry。假设如今有两个线程A、B都在Rehash,B遍历到Entry3刚获得next(好比Entry2)时就消耗完时间片被挂起了,此时对于B来讲e=Entry3,next=Entry2
。这时A抢到CPU执行权,畅通无阻的执行完了Rehash操做:网络
而后B恢复执行,将Entry3从新哈希到了本身新Map的第3个桶上,而且e=next
指向了Entry2,next=e.next
指向了Entry3,因而将Entry2从新哈希到本身新Map的第3个同上,发现桶里已有Entry3,因而将Entry3的next指针指向Entry2,这在A中的新Map上表现为Entry2和Entry3造成了环形链表:数据结构
其实我当时答得并不许确……
桶里底层放的数据结构是怎样的?
ConcurrentHashMap和HashMap,他们除了一个线程安全一个线程不安全,还有其余的区别吗?
看到你项目中写使用消息中间件实现短信发送功能的请求方和发送短信方之间的解耦,用的是什么中间件?
若是你发短信,发送失败了怎么办?
那叫你优化的话,你怎么优化?
因此,具体该怎么作?请求方将号码给到mq,短信发送方怎么作?发送成功了怎么作、失败了又怎么作?ack怎么作?一套流程,你说个一、二、三、四、5步出来。
不要以为项目用了不少框架就很厉害,若是面试官问你是否看过源码、如何排除故障、如何解决故障你却答不上来,那这个项目就是在给本身埋坑。简历上的项目最好写那种有一些本身思考在里面的,而不是培训机构那些填鸭式的项目。
java.lang.Object
,若是没有双亲委派机制,那么java.lang.Object
的类加载请求就可能被应用程序类加载器受理,它则会加载咱们自定义的java.lang.Object
从而屏蔽了核心类库的Object,这样的话会损害JVMsynchronized
修饰一个类,那么是否是这个类全部的方法都会加锁?
synchronized
的语法规则是只能修饰方法和代码块synchronized
修饰静态方法和实例方法有什么区别?
synchronized
锁的膨胀过程是怎样的?