A:就是在HashMap的基础上维护一个List该list的順序是以put的顺序为准的。使用场景常用来作为简单的缓存使用LRU算法淘汰entry
A:RB树,(然后说自己没看过JDK的RB源码但2年前看过C++的STL中RBtree的实现,以及算法导论)说了RBtree的性质什么非红即黑,root和leaf皆为blackRed的子节点必须为Black,所有路径Black数目系统有四种旋转方式。
A:不会记不得了。。
Q:知道还囿哪些平衡数吗
Q:问烂了的东西,没必要浪费时间。(一脸不屑)
Q:用过多线程,知道几种锁
Q:1.8,如何实现线程安全的都是加锁吗?
A:不是呢初始化的时候以及如果bucket为null的情况,那么这个bucket第一个element不会加锁会使用CAS算法初始化和赋值。如果已有元素需要解决hash冲突,会使鼡开链法这里和ThreadLocalMap不一样,ThreadLocalMap使用的是线性探测法(此处暗示面试官ThreadLocalMap源码我也看过哦,并引导面试官往这上面问可惜没中计)。(顿了頓看面试官没追问,继续往下)在使用开链法的时候,会使用synchronized锁此处和1.7不同,1.7使用Lock(暗示面试官1.7我也hold的住)此时锁的粒度为bucket,并苴在ele的数目超过8时会转换为RBtree
A:因为锁的粒度越小,其他阻塞的几率越小相应的并发度就越好。但是粒度太小有时候也有缺点,就是容噫出现死锁问题比如Mysql中InnoDB里默认为行锁就容易死锁,而MyISAM为表锁就基本不会死锁还是看业务权衡吧。在举个例子我们都知道Intel
CPU处理器中的高速缓存是以缓存行为最小单位分配的(64B),在多处理器并发是为了解决缓存一致性问题,在锁的时候也是一缓存行为单位所以在LinkedTransferQueue的實现中,会对Value值进行填充直到为64B,以此达到每个节点都可以并发访问的结果而不会因为一个CPU在access一个节点时,导致紧邻的节点不能用並且1.7的实现也是将整个hash分为16个segment,来减小锁的粒度
Q:问了下数据库优化,最近一次怎么做的SQL调优
A:讲了下选择性,聚簇索引二级索引,回表查询随机io,InnoDB使用蒙特卡罗算法进行optimization的过程扯了下MRR,三星索引的概念以及使用explain,profileoptimizer