面试问题合集
1、ConcurrentHashMap 是线程安全的HashMap集合
- 相对于hashMap来说,ConcurrentHashMap保证线程的安全性,当HashMap暴露在多个线程中的时候,可能会导致HashMap集合内部的数据发生错误的改变,导致很多链接丢失或者数据不对。
- 相对于hashTable来说,虽然hashTbale也是线程安全的,但是性能方面,HashTable远不如ConcurrentHashMap,HashTable要保持线程安全是将类的字节码加锁,这样性能会很差,而ConcurrentHashMap由一个个 Segment 组成,Segment 代表”部分“或”一段“的意思,所以很多地方都会将其描述为分段锁,所以每次需要加锁的操作锁住的是一个 segment,这样只要保证每个 Segment 是线程安全的,也就实现了全局的线程安全。
2、当ConcurrentHashMap上有一个线程在做写入操作,如果另外一个线程是去其他的segment里读数据的话,此时是允许操作的,但是如果此时这个线程是去相同的segment中做读操作的话,就不允许此次读取,只有当那个写入操作的线程完成后,才能执行读操作
3、ConcurrentHashMap有些方法需要跨段,比如size()和containsValue(),它们可能需要锁定整个表而而不仅仅是某个段,这需要按顺序锁定所有段,操作完毕后,又按顺序释放所有段的锁。这里“按顺序”是很重要的,否则极有可能出现死锁,在ConcurrentHashMap内部,段数组是final的,并且其成员变量实际上也是final的,但是,仅仅是将数组声明为final的并不保证数组成员也是final的,这需要实现上的保证。这可以确保不会出现死锁,因为获得锁的顺序是固定的。