JAVA面经复习(二十一)
面试难度:<mark>☆☆☆☆</mark>

问:string常量,是在哪个过程被存入内存中的?

答:尚且没有找到合适的答案,待补充。

问:间隙锁讲一讲?

答:间隙锁是指将数据按照分桶的思想分为多个间隙,如[0,100]分为[0,20]、[20,40]…[80,100]。在对五个区间中的任一个进行操作的时候,不允许对这个区间内的数据进行改动,在保护互斥的情况下最大程度保存的并发性能。

问:hashmap全家桶?

答:hashmap,hashtable,concurrenthashmap。其中hashmap底层结构为数组+链表/红黑树的结构,非线程安全,因为会出现数据覆盖和死循环的情况。而hashtable对所有方法都上了锁(synchronize),因此并发效率较低。而concurrenthashmap采用分段锁的方式,jdk1.7底层数据结构采用segment数组和hashentry数组组成,在jdk1.8中改造成了数组元素Node进行,同时采用CAS+Synchronize进行优化。

问:CAS和synchronized区别,性能等

答:CAS采用乐观锁的形式,通过判断预期值A和内存中的实际值A是否相同,来判断是否当前没有人在使用临界资源,否则进入自旋状态。synchronized则是采用悲观锁的思想,直接对特定的临界资源上锁,同时阻塞其余想要获取资源的线程。性能上CAS在并发时会好一点,但可能由于自旋,加大CPU的时间损坏。Synchronized则是完全的阻塞,并发效率没有CAS好,但不会出现线程自旋忙等的情况。

问:线程池,没有达到核心线程数,丢一个任务进来,大概流程

答:如果当前没有达到核心线程数,则创建一个核心线程。如果达到了,则放入阻塞队列。如果阻塞队列满了,则创建一个非核心线程。如果非核心线程也达到了上限,就采用拒绝的策略。

问:spring用注解的话,两个bean的id一样会怎么办?

答:前一个bean会被后一个bean给覆盖。因为在容器注册的时候存在覆盖机制。

问:IOC容器中的数据结构?除了concurrentHashmap外,还有什么?

答:????这题尚且不明题意。。。没有找到相关的答案。。

问:redis为什么比较快?list类型数据如何取出一部分

答:首先,采用了多路复用io阻塞机制单线程不需要进行线程切换,数据结构简单,操作节省时间。运行在内存中,自然速度快;
(利用两个列表类型的命令:lrange和ltrim) lrange key start end // 从左边依次返回key的[start,end] 的所有值,注意返回结果包含两端的值。
ltrim key start end //删除指定索引之外的所有元素,注意删除之后保留的元素包含两端的start和end索引值。

参考资料:
阿里淘系、考拉Java面经