分段锁的理解及其使用场景

1.ConcurrentHashMap

        ConcurrentHashMap使用分段锁保证线程安全,效率比使用synchronized的HashTable高很多,每个集合都可以看做一个存储东西的房子,HashTable与ConcurrentHashMap存储的都是HashEntry数组(每个数组里面是链表)。
        HashTable:在HashTable这个房子里,只有一个房间,里面是一长列的存放Entry的货架(数组)。只要有一个人进了这个房间,就会把这个房间锁起来,知道这个人在房间里面做完了事情出来后才会把们打开。如果有其他人需要进去,只能等待。这会导致外面等了很多人,效率不高。
分段锁的理解及其使用场景
        ConcurrentHashMap:在ConcurrentHashMap这个房子里,有很多房间,每个房间都存储着Entry货架(Entry数组的不同段,将一整个Entry数组分开了),这些房间各自又有着不同的锁。一个人在访问某一个房间时,会把这个房间锁起来,其他房间依然可以进去,这样可以大大提升效率。

分段锁的理解及其使用场景
        在HashTable中:线程A想访问Entry数组前面的位置,线程B想访问Entry数组后面的位置,如果A先进去了,房子就会被锁住,B不得不等待。
        在ConcerrentHashMap中:线程A想访问Entry数组前面的位置,线程B想访问Entry数组后面的位置,A进到了前面元素所在的房间访问,B仍然可以去尾部元素所在的房间,他们处在不同的房间。

2.分段锁

        先分段再锁,将原来的一整个的Entry数组分成了若干段,分别将这若干段放在了不同的新的Segment数组中(分房间),每个Segment有各自的锁,以此提高效率。

猜你喜欢

转载自blog.51cto.com/13678728/2481618