`

集合类同步性能分析

    博客分类:
  • java
阅读更多
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
 
import com.sun.org.apache.xalan.internal.xsltc.runtime.Hashtable;
 
public class CollectionDemo {
 
	public static void main(String[] args){
		testConcurrentList();
		testConcurrentMap();
	}
 
	public static void testConcurrentList(){
		long start = System.currentTimeMillis();
		long list_time = 0;
		List list = new ArrayList();
		for(int i = 0; i < 1000000; i++){
			list.add(i);
		}
		for(int i = 0; i < list.size(); i++){
			int k = (Integer) list.get(i);
		}
		list_time = System.currentTimeMillis() - start;
 
		start = System.currentTimeMillis();
		long vector_time = 0;
		Vector vec = new Vector();                    
// public synchronized void insertElementAt  同步所有方法
		for(int i = 0; i < 1000000; i++){
			vec.add(i);
		}
		for(int i = 0; i < vec.size(); i++){
			int k = (Integer) vec.get(i);
		}
		vector_time = System.currentTimeMillis() - start;
 
		start = System.currentTimeMillis();
		long concurrentList_time = 0;
        List concurrentList = Collections.synchronizedList(new ArrayList());  
// synchronized(mutex)同步需要同步的代码块
		for(int i = 0; i < 1000000; i++){
			concurrentList.add(i);
		}
		for(int i = 0; i < concurrentList.size(); i++){
			int k = (Integer) concurrentList.get(i);
		}
		concurrentList_time = System.currentTimeMillis() - start;
 
		start = System.currentTimeMillis();
		long copyOnWriteArrayList_time = 0;
		CopyOnWriteArrayList  copyOnWriteArrayList = new CopyOnWriteArrayList();  
//重入锁(ReentrantLock)是一种递归无阻塞的同步机制。
		for(int i = 0; i < 1000000; i++){
			concurrentList.add(i);
		}
		for(int i = 0; i < copyOnWriteArrayList.size(); i++){
			int k = (Integer) copyOnWriteArrayList.get(i);
		}
		copyOnWriteArrayList_time = System.currentTimeMillis() - start;
 
		System.out.println("list--------------- vector--------------
Collections.synchronizedList(new ArrayList()) --------CopyOnWriteArrayList");
        System.out.println(list_time + "------------" + vector_time + "------------" 
+ concurrentList_time + "------------" + copyOnWriteArrayList_time);
	}
	public static void testConcurrentMap(){
		long start = System.currentTimeMillis();
		long map_time = 0;
		Map map = new HashMap();
		for(int i = 0; i < 1000000; i++){
			map.put("item" + i,"value" + i);
		}
		for(int i = 0; i < map.size(); i++){
			Object value = map.get("item" + i);
		}
		map_time = System.currentTimeMillis() - start;
 
		start = System.currentTimeMillis();
		long ht_time = 0;
		Hashtable ht = new Hashtable();
		for(int i = 0; i < 1000000; i++){
			ht.put("item" + i,"value" + i);
		}
		for(int i = 0; i < ht.size(); i++){
			Object value = ht.get("item" + i);
		}
		ht_time = System.currentTimeMillis() - start;
 
		start = System.currentTimeMillis();
		long concurrentMap_time = 0;
        Map concurrentMap = Collections.synchronizedMap(new HashMap());
        for(int i = 0; i < 1000000; i++){
        	concurrentMap.put("item" + i,"value" + i);
		}
		for(int i = 0; i < concurrentMap.size(); i++){
			Object value = concurrentMap.get("item" + i);
		}
		concurrentMap_time = System.currentTimeMillis() - start;
 
		start = System.currentTimeMillis();
		long copyOnWriteArrayMap_time = 0;
		ConcurrentHashMap  concurrentHashMap = new ConcurrentHashMap();
		for(int i = 0; i < 1000000; i++){
			concurrentHashMap.put("item" + i,"value" + i);
		}
		for(int i = 0; i < concurrentHashMap.size(); i++){
			Object value = concurrentHashMap.get("item" + i);
		}
		copyOnWriteArrayMap_time = System.currentTimeMillis() - start;
 
		System.out.println("map--------------- hashTable--------------
Collections.synchronizedMap(new HashMap()); --------ConcurrentHashMap");
        System.out.println(map_time + "------------" + ht_time 
+ "------------" + concurrentMap_time + "------------" 
+ copyOnWriteArrayMap_time);
	}
}

 

输出:

数据量 List vector Collections.synchronizedList CopyOnWriteArrayList
1000000 62 125 172 47
5000000 485 953 1031 625
10000000 1078 1812 2329 2343

List如果需要同步,建议使用CopyOnWriteArrayList。如果不需要同步,则用list即可,不需要用同步,因为同步消耗很大的性能。

数据量 HashMap Hashtable Collections.synchronizedMap CopyOnWriteArrayMap
1000000 1375 1094 1469 1547
5000000 6860 6281 7688 8172
100000 78 125 78 94

Hashtable是Dictionary的子类,HashMap是Map接口的一个实现类;在数据量大的时候,hashtable的性能比较好,但是hashmap的功能更加强大,而且新框架中建议使用hashmap,不要使用hashtable。

没有同步的list,用同步的三种方式实现的list性能分析:
1.用老的Vector/Hashtable类,上面2个问题都不用担心。
Vector/Hashtable所提供的所有方法都是 synchronized的。如果 迭代的过程中数据结构被修改了,迭代器可以反映最新的修改,也不会抛异常。但这种方法效率低下,不建议使用。
2.使用ArrayList/HashMap和同步包装器
可用 同步包装器使容器变成线程安全的 对某些方法用synchronized
Java代码
1. List synchArrayList = Collections.synchronizedList(new ArrayList());

2. Map synchHashMap = Collections.synchronizedMap(new HashMap())

3.用java5.0新加入的ConcurrentLinkedQueue、ConcurrentHashMap、CopyOnWriteArrayList 和 CopyOnWriteArraySet
对这些集合进行并发修改是安全的。 用重入锁(ReentrantLock)是一种递归无阻塞的同步机制实现。

分享到:
评论

相关推荐

    .NET性能分析与调试

    .NET性能分析和调试技术涵盖了.NET框架的内部工作机制、CLR(公共语言运行时)内存管理、垃圾回收、线程同步以及调试工具的使用等方面。在.NET平台下,性能分析和调试不仅仅是定位问题那么简单,更是一个深入理解...

    Java 集合类面试题.docx

    在Java编程中,集合框架是核心部分,...面试中,这些知识点通常会结合具体场景进行深入讨论,如性能分析、内存占用、线程安全问题以及如何选择合适的集合类等。理解这些概念并能灵活运用,对于Java程序员来说至关重要。

    java并发集合

    Java提供了一系列的并发集合类,使得在并发环境中实现高效且线程安全的数据处理成为可能。这些集合主要存在于`java.util.concurrent`包中,设计目标是提高并发性能并减少同步开销。 首先,我们要了解Java并发集合的...

    (zz)java集合类总结

    本文将对Java标准类库中的集合类进行系统性的总结与分析。 #### 一、Java集合框架概览 Java集合框架主要包括三种主要类型的容器:`List`、`Set` 和 `Map`,以及一些辅助接口和类。这些容器提供了存储和操作对象的...

    Java集合框架常见面试题.pdf

    * 提高了程序的性能:Java 集合框架提供的集合类和遍历集合的方式,提高了程序的性能和响应速度。 Java 集合框架的应用 Java 集合框架的应用非常广泛,包括: * 数据存储:Java 集合框架可以用于存储和操作大规模...

    第一章 Java常用集合类总览1

    本章我们将概览Java中最常用的集合类,特别是Collection接口及其子接口List,以及Map接口。 首先,Collection接口是所有集合类的基础,它定义了对一组对象的基本操作。List接口是Collection的一个子接口,它允许...

    Java同步线程模型分析与改进研究.pdf

    或者使用并发集合来替代传统的集合类,这样可以在多线程环境下实现更好的性能。 在实际操作中,Java同步线程模型的应用需要特别注意线程的创建和管理。合理设置系统进程数目、控制上下文切换次数以及线程的合理分工...

    集合底层源码分析.doc

    HashMap作为Java中最常用的集合类之一,它的实现原理与高效性能深受开发者喜爱。本文将深入探讨HashMap的概述、数据结构及其内部实现机制。 首先,HashMap是一个基于哈希表的Map接口的非同步实现,这意味着它在多...

    Java性能优化的45个细节.pdf

    内容包括单例模式的合理应用、静态变量的使用考量、对象创建与垃圾回收策略...性能差异、多线程环境下集合类的选择、HashMap的合理创建、资源释放的finally块、移位运算符的使用优化、StringBuffer的容量确定等45个细节...

    Java性能调优--关于垃圾回收机制的分析和指导

    Java性能调优,特别是关于垃圾回收机制的分析和指导,是优化Java应用程序的关键环节。Java的垃圾回收(Garbage Collection, GC)是自动管理内存的一种机制,它负责识别并清理那些不再使用的对象,以释放内存资源。...

    Java列表对象的性能分析和测试

    ### Java列表对象的性能分析与测试 #### 一、引言 在Java编程语言中,`java.util.List`接口提供了一种存储有序集合的方式。它包括了多种实现类,如`LinkedList`、`Vector`和`ArrayList`等。每种实现都有其独特的...

    Java同步线程模型分析与改进.pdf

    此外,利用现代Java虚拟机(如Java 8及以上版本)提供的并发工具,比如java.util.concurrent包中的并发集合和原子类,可以在很多情况下替代传统的同步块,从而减少死锁的风险。 Java同步线程模型的另一个应用场景是...

    Java编程中影响性能的细节

    6. **选择合适的包装类型和基本类型**:包装类型适用于需要对象的场景,如集合类。而在其他情况下,使用基本类型可以减少不必要的对象创建,提高性能。 7. **谨慎使用synchronized**:同步操作会带来性能开销,可能...

    c# 多线程 同步问题解决

    开发者需要仔细分析应用中可能出现的同步问题,并设计合理的同步策略。 例如,对于一个简单的计数器应用程序,如果多个线程要增加计数器的值,就需要同步访问计数器变量: ```csharp private readonly object ...

    各类工具集合

    这个名为"各类工具集合"的压缩包显然包含了多种用途的实用工具,其中包括时间转换工具、MySQL客户端以及网络分析软件Wireshark。下面将详细阐述这些工具的重要性和使用场景。 1. **时间转换工具**: 时间转换工具...

    超级类集合

    10. **多线程注入类**:多线程编程允许同时执行多个任务,而注入类则允许在运行时将代码插入到其他进程中,常用于自动化测试、性能分析等场景。 11. **脚本控制类**:脚本控制类提供了运行和管理脚本的能力,如解释...

    java类源码-JavaCollection:基于JDK1.8的集合类源码分析

    5. **线程安全**:非同步的集合类在多线程环境下可能会引发问题,需注意线程安全问题和同步解决方案,如`ConcurrentHashMap`和`CopyOnWriteArrayList`。 通过对`JavaCollection`源码的深入分析,我们可以更好地理解...

    .net性能优化宝典

    但是,如果不需要线程安全性,使用`Dictionary, TValue&gt;`等非线程安全的集合可能会提供更好的性能。 #### 1.9 避免使用ArrayList `ArrayList`是一个动态数组,但它的性能不如泛型集合如`List&lt;T&gt;`。后者提供了更好...

    01大数据面试复习----Java基础---集合类、多线程、JVM.zip

    在准备大数据面试的过程中,Java基础是必不可少的一部分,尤其聚焦于集合类、多线程和JVM这三大核心领域。下面将分别对这三个方面进行深入探讨。 **一、Java集合类** Java集合框架是处理对象组的重要工具,它包括...

Global site tag (gtag.js) - Google Analytics