ConcurrentHashMap:
支持检索的完全并发和更新的所期望可调整并发的哈希表。此类遵守与 Hashtable 相同的功能规范,并且包括对应于 Hashtable 的每个方法的方法版本。不过,尽管所有操作都是线程安全的,但检索操作不 必锁定,并且不 支持以某种
防止所有访问的方式锁定整个表。此类可以通过程序完全与 Hashtable 进行互操作,这取决于其线程安全,而与其同
步细节无关
简单说,ConcurrentHashMap是线程安全,用法和HashMap差不多
不过ConcurrentHashMap的性能比Collections.synchronizedMap(new HashMap<>)快的多例如下面的例子
import java.util.Collections;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 测试HashMap和ConcurrentHashMap的并发性能差别。
*
* @author 老紫竹 JAVA世纪网(java2000.net)
*
*/
public class FinalMain {
static final int threads = 1000;
static final int NUMBER = 1000;
public static void main(String[] args) throws Exception {
Map<String, Integer> hashmapSync = Collections
.synchronizedMap(new HashMap<String, Integer>());
Map<String, Integer> concurrentHashMap = new ConcurrentHashMap<String, Integer>();
Map<String, Integer> hashtable = new Hashtable<String, Integer>();
long totalA = 0;
long totalB = 0;
long totalC = 0;
for (int i = 0; i <= 10; i++) {
totalA += testPut(hashmapSync);
totalB += testPut(concurrentHashMap);
totalC += testPut(hashtable);
}
System.out.println("Put time HashMapSync=" + totalA + "ms.");
System.out.println("Put time ConcurrentHashMap=" + totalB + "ms.");
System.out.println("Put time Hashtable=" + totalC + "ms.");
totalA = 0;
totalB = 0;
totalC = 0;
for (int i = 0; i <= 10; i++) {
totalA += testGet(hashmapSync);
totalB += testGet(concurrentHashMap);
totalC += testGet(hashtable);
}
System.out.println("Get time HashMapSync=" + totalA + "ms.");
System.out.println("Get time ConcurrentHashMap=" + totalB + "ms.");
System.out.println("Get time Hashtable=" + totalC + "ms.");
}
public static long testPut(Map<String, Integer> map) throws Exception {
long start = System.currentTimeMillis();
for (int i = 0; i < threads; i++) {
new MapPutThread(map).start();
}
while (MapPutThread.counter > 0) {
Thread.sleep(1);
}
return System.currentTimeMillis() - start;
}
public static long testGet(Map<String, Integer> map) throws Exception {
long start = System.currentTimeMillis();
for (int i = 0; i < threads; i++) {
new MapPutThread(map).start();
}
while (MapPutThread.counter > 0) {
Thread.sleep(1);
}
return System.currentTimeMillis() - start;
}
}
class MapPutThread extends Thread {
static int counter = 0;
static Object lock = new Object();
private Map<String, Integer> map;
private String key = this.getId() + "";
MapPutThread(Map<String, Integer> map) {
synchronized (lock) {
counter++;
}
this.map = map;
}
public void run() {
for (int i = 1; i <= FinalMain.NUMBER; i++) {
map.put(key, i);
}
synchronized (lock) {
counter--;
}
}
}
class MapGetThread extends Thread {
static int counter = 0;
static Object lock = new Object();
private Map<String, Integer> map;
private String key = this.getId() + "";
MapGetThread(Map<String, Integer> map) {
synchronized (lock) {
counter++;
}
this.map = map;
}
public void run() {
for (int i = 1; i <= FinalMain.NUMBER; i++) {
map.get(key);
}
synchronized (lock) {
counter--;
}
}
}
运行结果
Put time HashMapSync=3949ms.
Put time ConcurrentHashMap=1143ms.
Put time Hashtable=3396ms.
Get time HashMapSync=3861ms.
Get time ConcurrentHashMap=1029ms.
Get time Hashtable=3409ms.
分享到:
相关推荐
本篇文章将探讨几种不同的C#对象复制方法,并进行性能对比,帮助开发者选择最合适的策略。以下是所涉及的知识点详解: 1. **浅复制与深复制** - 浅复制(Shallow Copy)仅复制对象的引用,不复制对象内部引用的...
4. **对比不同编译选项**:尝试不同的优化级别或链接选项,观察map文件的变化,评估其对性能的影响。 总的来说,理解并有效利用map文件是Linux系统优化的关键技能之一。通过熟练掌握相关的分析工具和方法,我们可以...
2. **性能优化**:Map文件揭示了程序中各个部分的大小和位置,这有助于识别可能的内存浪费或过度使用。例如,如果一个函数占用的空间过大,可能需要优化代码来减小其体积。 3. **链接器优化**:在链接阶段,通过...
此外,`hash_map`的性能还依赖于桶的数量,桶的数量越大,每个桶中元素的平均数量就越少,冲突的可能性也就越小,查找效率越高。在实际使用中,可以通过调整桶的数量来优化性能。 使用`hash_map`的示例代码如下: ...
实验验证部分可能会展示不同算法在不同数据规模和硬件配置下的性能对比,以帮助开发者做出最佳选择。 总的来说,本文的工作提供了关于MapReduce环境下分布式数据排序的深入理解,为实际应用提供了理论指导和实践...
综上所述,“D3D11_ShadowMap1”项目深入探讨了如何在Direct3D11中使用深度阴影贴图技术,结合各个源文件的职责,展示了3D图形编程中的阴影模拟过程。通过理解并实践这些技术,开发者可以为3D游戏和应用创建更为真实...
2. "AD9361-Register-Map-v2.8C.pdf":这是原始的英文版寄存器映射手册,可能是某个版本的更新,对于需要查阅英文原版或者对比差异的用户来说很有价值。 3. "BBS.txt":这个文件名可能代表“Black Box Simulator”或...
3.correction与基准map对比: 在实际生产中,由于各种因素的影响,测试结果可能会出现偏差。为确保测试准确性,我们需要对wafer map进行校正(correction)。WaferMapTool提供了这一功能,可以将新的wafer map与预设...
以下是STL中几种常见容器的性能比较,以及其在特定操作下的行为和效率。 1. **vector**: - **内存分配**:vector通常在内存中连续存储元素,因此读取速度快,访问效率高。当需要插入或删除元素时,如果容量不足,...
通过比较不同SNR条件下的误码率,我们得出结论:MAP算法能够有效提高系统的解码性能,特别是在噪声较大的环境中。此外,本文还提供了详细的MATLAB代码示例,可以帮助读者更好地理解和应用这些理论知识。
相信大家在看一些目标检测论文中经常会看到作者将自己的模型和其他的模型做了mAP...YOLOv3论文中的各个模型的mAP对比图: 目标检测问题中,每张图片可能包含多个不同类别的不同物体,需要评测模型的分类和定位性能.
开发者可以利用maphash库提供的方法来降低哈希冲突的影响,提高整体性能。 总的来说,maphash-0.1.0-py3-none-any.whl这个压缩包为我们提供了一个强大且易用的哈希工具,尤其适合Python 3的开发者。通过理解和掌握...
2. **流水线技术**:采用流水线技术优化算法执行流程,确保各个计算步骤能够无缝衔接,减少等待时间。 3. **循环展开**:通过循环展开技术减少循环控制开销,进一步加速算法执行。 4. **寄存器分配**:合理分配...
以下是关于文档中提到的各个方面的详细知识点: 1. **Spark作业性能优化的重要性**: - Spark作为一个快速的大数据计算平台,能够在多个领域如离线批处理、SQL处理、流式计算、机器学习和图计算等方面发挥关键作用...
文中比较了Hadoop自带的推测执行算法与SALS(Sequentially Aggressive Load Shedding)推测执行算法,分析了它们在不同场景下的性能表现。 此外,论文还探讨了MapReduce中的通用二路连接算法RSJ(Recursive Split ...
C-MAPSS是一个强大的工具,用于模拟飞机发动机在整个飞行循环中的复杂行为,包括起动、爬升、巡航、下降和停车等各个阶段。这个数据集对工程师、研究人员以及航空业的学者来说,是一个宝贵的学习和测试新算法的平台...
- **性能评估**:通过对比路线长度、所需时间等因素,评估所提方法的有效性。 综上所述,本文介绍的方法不仅能够有效地从原始GPS轨迹中提取出准确的路网信息,还能进一步应用于实际的路线规划中,为用户提供高效、...
JavaScript产品参数对比功能是网页应用中常见的一种设计,它允许用户在不同的产品之间进行详细的特性比较,以便于做出购买决策。这种功能广泛应用于电子商务、软件选型和其他需要展示多维度信息的场景。在本文中,...