各个Map之间性能对比

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.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: mmaxwell效率map图是一种用于描述数据处理效率的可视化工具。这种图形通常将x轴描述为处理器核数,y轴描述为处理速度(通常是行/秒或字节/秒)。每个数据点代表一个数据处理任务的效率,从而可以更直观地看出不同处理器核数下处理任务的效率变化情况。 使用mmaxwell效率map图可以有助于优化数据处理流程。通过比较不同核数下数据处理效率的差异,可以确定最佳的核数配置。同时,该图也可以用于监控系统中各处理任务的效率,及时发现异常情况。 需要注意的是,在绘制mmaxwell效率map图时,需要对数据进行精确的测量和采集,以保证数据的准确性和可比性。同时,数据的规模和复杂程度也会影响图形的可读性和可理解性,在选择数据处理任务并确定核数时需要进行综合考虑。 ### 回答2: mmaxwell效率map图是一种可视化工具,用于展示计算机系统中各个组件的性能指标和效率。该图像通过颜色渐变和即时反馈,可以让用户快速地识别任何性能瓶颈,并且针对性地进行调整。 这种效率map图绝不仅仅是一个简单的图表,而是一种数据驱动的监控工具,可以帮助IT管理员和工程师们监视系统性能,从而发现和解决与性能有关的问题。 图形化的展示方式,使得用户更加直观、快速地获取系统性能指标。 mmaxwell效率map图的一个重要应用是帮助用户对复杂的系统进行优化。通过对系统中各个组件的性能指标进行监视,用户可以针对性地进行优化,从而提升整个系统的效率。这种优化通常包括了对磁盘IO、网络吞吐、CPU利用率等指标的分析和管理。 总之,mmaxwell效率map图是一种令人印象深刻的工具,可以帮助用户更好地监视和优化计算机系统的性能。它可以为企业提供效的IT解决方案,并且可以帮助用户更快地发现问题并解决问题,从而提升生产力和降低成本。 ### 回答3: mmaxwell效率map图是一种用于可视化数据分析中的图表类型,主要用于展示某个事物或过程中的效率变化情况。该图表通常呈现为一个折线图,横轴为时间或步骤,纵轴为效率指标,如生产数量、完成时间或错误率等。 通过mmaxwell效率map图,我们可以方便地比较不同时间段或步骤之间的效率变化趋势,查看哪些因素影响了效率的提或下降。例如,生产车间可以通过mmaxwell效率map图观察不同生产批次的效率变化情况,找出生产过程中存在的问题并进行改进。 此外,mmaxwell效率map图也可以用于跟踪某个个人或团队的工作效率,在不同时间段或项目上的表现,以便进行个人或团队的绩效评估和管理。 总之,mmaxwell效率map图是一种简单而有效的数据可视化工具,可以帮助我们更好地理解事物或过程中的效率变化趋势,从而为我们提供合理的决策建议。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值