【ConcurrentHashMap 和 SynchronizedHashMap 的区别
原文:https://www . geesforgeks . org/difference-concurrenthashmap-and-synchronized hashmap/
ConcurrentHashMap 和 SynchronizedHashMap 都是线程安全的 Collection 类,可以在多线程和并发 java 应用程序中使用。但是它们之间几乎没有区别。在本文中,我们试图涵盖它们之间的所有这些差异。
1。ConcurrentHashMap:ConcurrentHashMap 是实现 ConcurrentMap 接口的类。它使用哈希表,带下划线的数据结构。正如我们所知,在我们的应用程序中处理线程时 HashMap 不是一个好的选择,因为性能问题。为了解决这个问题,我们在应用程序中使用了 ConcurrentHashMap。ConcurrentHashMap 是线程安全的,因此多个线程可以对单个对象进行操作,没有任何问题。在 ConcurrentHashMap 中,对象根据并发级别被分成多个段。默认情况下,它允许 16 个线程从映射读写,无需任何同步。在 ConcurrentHashMap 中,任何数量的线程都可以执行检索操作,但是为了更新对象,线程必须锁定线程想要操作的特定段。这种锁定机构称为分段锁定或铲斗锁定。因此,有时 16 个更新操作可以由线程执行。
ConcurrentHashMap 演示:
Java 语言(一种计算机语言,尤用于创建网站)
// Java Program to demonstrate the
// working of ConcurrentHashMap
import java.util.*;
import java.util.concurrent.*;
public class TraversingConcurrentHashMap {
public static void main(String[] args)
{
// create an instance of ConcurrentHashMap
ConcurrentHashMap<Integer, String> chmap
= new ConcurrentHashMap<Integer, String>();
// Add elements using put()
chmap.put(10, "Geeks");
chmap.put(20, "for");
chmap.put(30, "Geeks");
chmap.put(40, "Welcome");
chmap.put(50, "you");
// Create an Iterator over the
// ConcurrentHashMap
Iterator<ConcurrentHashMap.Entry<Integer, String> >
itr = chmap.entrySet().iterator();
// The hasNext() method is used to check if there is
// a next element and the next() method is used to
// retrieve the next element
while (itr.hasNext()) {
ConcurrentHashMap.Entry<Integer, String> entry
= itr.next();
System.out.println("Key = " + entry.getKey()
+ ", Value = "
+ entry.getValue());
}
}
}
Output
Key = 50, Value = you
Key = 20, Value = for
Key = 40, Value = Welcome
Key = 10, Value = Geeks
Key = 30, Value = Geeks
2。同步 HashMap: Java HashMap 是一个非同步的集合类。如果我们需要对它执行线程安全操作,那么我们必须显式地同步它。使用 java.util.Collections 类的 synchronizedMap() 方法进行同步。它返回由指定映射支持的同步(线程安全)映射。
同步 HashMap 演示:
Java 语言(一种计算机语言,尤用于创建网站)
// Java program to demonstrate the
// working of Synchronized HashMap
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class SynchronizedHashMap {
public static void main(String args[])
{
// Creating a HashMap
HashMap<Integer, String> hmap
= new HashMap<Integer, String>();
// Adding the elements using put method
hmap.put(10, "Geeks");
hmap.put(20, "for");
hmap.put(30, "Geeks");
hmap.put(25, "Welcome");
hmap.put(40, "you");
// Creating a synchronized map
Map map = Collections.synchronizedMap(hmap);
Set set = map.entrySet();
// Synchronize on HashMap, not on set
synchronized (map)
{
Iterator i = set.iterator();
// Printing the elements
while (i.hasNext()) {
Map.Entry me = (Map.Entry)i.next();
System.out.print(me.getKey() + ": ");
System.out.println(me.getValue());
}
}
}
}
Output
20: for
40: you
25: Welcome
10: Geeks
30: Geeks
【ConcurrentHashMap 和 Synchronized HashMap 的区别:
| ConcurrentHashMap | 同步哈希表 | | ConcurrentHashMap 是一个实现 ConcurrentMap 和 [serializable](https://www.geeksforgeeks.org/serializable-interface-in-java/) 接口的类。 | 我们可以使用 java.util.Collections 类的 **synchronizedMap()** 方法来同步 HashMap。 | | 它锁定了地图的某个部分。 | 它锁定了整个地图。 | | ConcurrentHashMap 允许执行并发读写操作。因此,性能相对优于同步映射。 | 在同步哈希表中,多个线程不能同时访问映射。因此,性能相对低于 ConcurrentHashMap。 | | ConcuurentHashMap 不允许将 null 作为键或值插入。 | 同步哈希表允许插入空值作为关键字。 | | ConccurentHashMap 不抛出 ConcurrentModificationException。 | 同步哈希表抛出**并发修改异常**。 |版权属于:月萌API www.moonapi.com,转载请注明出处