Java 中的 ConcurrentHashMap
先决条件: 同意地图
在 JDK 1.5 中引入的 ConcurrentHashMap 类属于 java.util.concurrent 包,它实现了 ConcurrentMap,也实现了 Serializable 接口。ConcurrentHashMap 是 HashMap 的一个增强,因为我们知道在我们的应用程序中处理 Threads 的同时 HashMap 并不是一个好的选择,因为性能方面的 HashMap 并不达标。
ConcurrentHashMap 的要点:
- ConcurrentHashMap 的下划线数据结构是哈希表。
- ConcurrentHashMap 类是线程安全的,即多个线程可以在单个对象上操作,没有任何复杂性。
- 任何时候,任何数量的线程都适用于读取操作,而不会锁定 HashMap 中不存在的 ConcurrentHashMap 对象。
- 在 ConcurrentHashMap 中,对象根据并发级别被分成多个段。
- ConcurrentHashMap 的默认并发级别是 16。
- 在 ConcurrentHashMap 中,任何数量的线程都可以执行检索操作,但是要在对象中进行更新,线程必须锁定线程想要操作的特定段。这种锁定机构称为分段锁定或铲斗锁定。因此,一次可以由线程执行 16 个更新操作。
- 在 ConcurrentHashMap 中,不能将空对象作为键或值插入。
申报:
公共类 ConcurrentHashMap 扩展抽象映射实现 ConcurrentMap ,Serializable
这里 K 为关键对象类型, V 为值对象类型。
并发哈希表的层次结构
它实现了 Serializable 、 ConcurrentMap < K、V>T3、 Map < K、V>T5 接口,扩展了 AbstractMap < K、V>T7】类。
ConcurrentHashMap 的构造函数
- 并发级别:是并发更新映射的线程数。该实现执行内部调整以尝试容纳这么多线程。
- 负载系数:这是一个阈值,用于控制调整大小。
- 初始容量:容纳最初由实现提供的一定数量的元素。如果这张地图的容量是 10。这意味着它可以存储 10 个条目。
1。ConcurrentHashMap() :创建一个新的空映射,默认初始容量(16)、负载系数(0.75)和 concurrencyLevel (16)。
ConcurrentHashMapCHM = new ConcurrentHashMap<>();
2。ConcurrentHashMap(int initial capacity):使用指定的初始容量、默认负载系数(0.75)和并发级别(16)创建一个新的空映射。
ConcurrentHashMapCHM = new ConcurrentHashMap<>(int initial capacity);
3。ConcurrentHashMap(int initial capacity,float loadFactor) :使用指定的初始容量和加载因子以及默认的 concurrencyLevel (16)创建一个新的空映射。
ConcurrentHashMapCHM = new ConcurrentHashMap<>(int initial capacity,float load factor);
4。(int initial capacity,float loadFactor,int concurrencyLevel) :使用指定的初始容量、加载因子和并发级别创建一个新的空映射。
ConcurrentHashMapCHM = new ConcurrentHashMap<>(int initial capacity,float loadFactor,int concurrency level);
5。ConcurrentHashMap(Map m) :创建一个新的映射,其映射与给定的映射相同。
ConcurrentHashMapCHM = new ConcurrentHashMap<>(地图 m);
示例:
Java 语言(一种计算机语言,尤用于创建网站)
// Java program to demonstrate working of ConcurrentHashMap
import java.util.concurrent.*;
class ConcurrentHashMapDemo {
public static void main(String[] args)
{
// create an instance of
// ConcurrentHashMap
ConcurrentHashMap<Integer, String> m
= new ConcurrentHashMap<>();
// Insert mappings using
// put method
m.put(100, "Hello");
m.put(101, "Geeks");
m.put(102, "Geeks");
// Here we cant add Hello because 101 key
// is already present in ConcurrentHashMap object
m.putIfAbsent(101, "Hello");
// We can remove entry because 101 key
// is associated with For value
m.remove(101, "Geeks");
// Now we can add Hello
m.putIfAbsent(103, "Hello");
// We cant replace Hello with For
m.replace(101, "Hello", "For");
System.out.println(m);
}
}
Output
{100=Hello, 102=Geeks, 103=Hello}
版权属于:月萌API www.moonapi.com,转载请注明出处