HashMap可能会问的一连串问题

来源:互联网 发布:海参真的有用吗 知乎 编辑:程序博客网 时间:2024/06/17 17:04

1,第一个问题一般会问 了解HashMap吗,或者说介绍下HashMap的底层原理?

回答:HashMap由数组+链表组成,数组元素Entry存放的是键值对,然后说查询,插入,删除,都要用到hash算法,把hash算法介绍一下,然后分别介绍查询,插入,删除。然后说hashMap1.8又有了改变,这时面试官极有可能会问有什么变化,不问的话你就继续说1.8的hashMap,链表长度到达8时会转变为红黑树。这边也可能会问红黑树。说完之后可以补一句说但是hashMap不是线程安全的。

2,然后就可能会问HashMap为啥不安全?什么情况下不安全?

在hashmap做put操作的时候会调用到以上的方法。现在假如A线程和B线程同时对同一个数组位置调用addEntry,两个线程会同时得到现在的头结点,然后A写入新的头结点之后,B也写入新的头结点,那B的写入操作就会覆盖A的写入操作造成A的写入操作丢失。

可能会造成死循环。

3,然后问如何使hashMap安全?

回答:第一种方法是使用Collections.synchronizedMap(new HashMap());第二种方法:ConcurrentHashMap的方法分段锁。

4,接着会问synchonizedMap是如何实现安全的或者ConcurrentHashMap 是如何实现安全的,(不问就自己说)?

synchronizedMap对方法里的语句块使用synchronized关键字加锁来保证线程安全,ConcurrentHashMap使用分段锁,默认分成16个Segment,每个Segment相当于一个hashtable,线程安全是使用ReentrantLock实现的。1.8使用了不同的方法,使用CAS+synchronized实现。

5,会问synchronized的原理?

在synchronized编译之后,同步块的前后会生成monitorenter和monitorexit字节码指令。执行monitorenter指令时会先取得对象的锁,如果对象没被锁定或者当前线程已经拥有了这个锁,线程可以进入,同时锁的计数器加1,如果取不到就会阻塞等待。执行monitorexit指令时计数器减1,直到为0才会释放这个锁。

6,Lock原理?

使用同步器存储了一个状态变量,使用CAS比较更新一个状态量。。。。。



原创粉丝点击