教育行业A股IPO第一股(股票代码 003032)

全国咨询/投诉热线:400-618-4000

Java8开始ConcurrentHashMap,为什么舍弃分段锁?

更新时间:2023年04月10日10时11分 来源:传智教育 浏览次数:

好口碑IT培训

  Java8中的ConcurrentHashMap通过使用一种称为“分离锁”的技术,摒弃了Java7及之前版本中使用的分段锁机制。

  在Java7及之前版本中,ConcurrentHashMap被分成一些段,每个段上有一个独立的锁来控制对该段的访问。这样的做法能够提高并发性能,但是也存在一些问题,比如:

  ·同时只有一个线程能够修改一个段中的数据,当多个线程尝试修改同一段中的数据时,需要通过竞争该段上的锁来获取访问权限,这会导致一定程度的竞争和等待,降低并发性能。

  ·当需要扩容时,需要重新分配段数组,并将原有数据复制到新数组中。这个过程需要停止所有的读写操作,并持有整个ConcurrentHashMap的全局锁,会导致所有的线程都被阻塞,对性能有很大的影响。

  为了解决这些问题,Java8中的ConcurrentHashMap采用了“分离锁”的技术。具体来说,ConcurrentHashMap内部维护了一些独立的桶,每个桶上有一个独立的锁,每个锁只保护对应的桶上的数据。

  这种做法的好处是:

  ·多个线程可以同时访问不同的桶,避免了对同一段锁的竞争。

  ·当需要扩容时,只需要对需要扩容的桶进行操作,不需要持有全局锁,可以保证其他桶的并发访问不受影响。

  以下是Java8中ConcurrentHashMap的简单代码示例:

ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);

int value = map.getOrDefault("D", 0);
System.out.println(value); // 输出0

  在上述代码中,ConcurrentHashMap使用了默认的构造函数创建,表示内部不包含任何元素。接着通过put方法向ConcurrentHashMap中添加了三个键值对。最后使用getOrDefault方法获取键值对中键为"D"的值,由于该键不存在,返回了默认值0。

0 分享到:
和我们在线交谈!