- 浏览: 755566 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
lgh1992314:
a offset: 26b offset: 24c offse ...
java jvm字节占用空间分析 -
ls0609:
语音实现在线听书http://blog.csdn.net/ls ...
Android 语音输入API使用 -
wangli61289:
http://viralpatel-net-tutorials ...
Android 语音输入API使用 -
zxjlwt:
学习了素人派http://surenpi.com
velocity宏加载顺序 -
tt5753:
谢啦........
Lucene的IndexWriter初始化时的LockObtainFailedException的解决方法
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)是一种递归无阻塞的同步机制实现。
发表评论
-
对字符串进行验证之前先进行规范化
2013-09-17 23:18 13957对字符串进行验证之前先进行规范化 应用系统中经常对字 ... -
使用telnet连接到基于spring的应用上执行容器中的bean的任意方法
2013-08-08 09:17 1482使用telnet连接到基于spring的应用上执行容器中 ... -
jdk7和8的一些新特性介绍
2013-07-06 16:07 10114更多ppt内容请查看:htt ... -
java对于接口和抽象类的代理实现,不需要有具体实现类
2013-06-12 09:50 2957原文链接:http://www.javaarch.net/j ... -
Java EE 7中对WebSocket 1.0的支持
2013-06-05 09:27 3846原文链接:http://www.javaarch.n ... -
Java Web使用swfobject调用flex图表
2013-05-28 19:05 1128Java Web使用swfobject调用 ... -
spring使用PropertyPlaceholderConfigurer扩展来满足不同环境的参数配置
2013-05-21 15:57 3344spring使用PropertyPlaceholderCon ... -
java国际化
2013-05-20 20:57 4478java国际化 本文来自:http://www.j ... -
RSS feeds with Java
2013-05-20 20:52 1226RSS feeds with Java 原文来自:htt ... -
使用ibatis将数据库从oracle迁移到mysql的几个修改点
2013-04-29 10:40 1679我们项目在公司的大战略下需要从oracle ... -
线上机器jvm dump分析脚本
2013-04-19 10:48 2912#!/bin/sh DUMP_PIDS=`p ... -
eclipse远程部署,静态文件实时同步插件
2013-04-06 20:18 5469eclipse 远程文件实时同步,eclipse远程 ... -
java价格处理的一个问题
2013-03-26 21:21 1841我们经常会处理一些价格,比如从运营上传的文件中将某 ... -
java 服务降级开关设计思路
2013-03-23 16:35 3772java 服务屏蔽开关系统,可以手工降级服务,关闭服 ... -
poi解析excel内存溢出
2013-03-20 22:21 6406真是悲剧啊,一个破内部使用系统20多个人使用的后 ... -
简单web安全框架
2013-03-16 11:56 1551web安全框架,主要用servlet filter方 ... -
基于servlet的简单的页面缓存框架
2013-03-11 19:27 1222基于servlet的页面级缓存框架的基本用法: 代码参考: ... -
Eclipse使用过程中出现java.lang.NoClassDefFoundError的解决方案
2013-02-01 17:22 1582如果jdk,classpath设置正确,突然在eclipse ... -
jetty对于包的加载顺序的处理
2013-01-28 22:58 41421.问题 今天在本地和测试环境用jet ... -
hsqldb源码分析系列6之事务处理
2013-01-20 15:20 1712在session的 public Result ...
相关推荐
.NET性能分析和调试技术涵盖了.NET框架的内部工作机制、CLR(公共语言运行时)内存管理、垃圾回收、线程同步以及调试工具的使用等方面。在.NET平台下,性能分析和调试不仅仅是定位问题那么简单,更是一个深入理解...
在Java编程中,集合框架是核心部分,...面试中,这些知识点通常会结合具体场景进行深入讨论,如性能分析、内存占用、线程安全问题以及如何选择合适的集合类等。理解这些概念并能灵活运用,对于Java程序员来说至关重要。
Java提供了一系列的并发集合类,使得在并发环境中实现高效且线程安全的数据处理成为可能。这些集合主要存在于`java.util.concurrent`包中,设计目标是提高并发性能并减少同步开销。 首先,我们要了解Java并发集合的...
本文将对Java标准类库中的集合类进行系统性的总结与分析。 #### 一、Java集合框架概览 Java集合框架主要包括三种主要类型的容器:`List`、`Set` 和 `Map`,以及一些辅助接口和类。这些容器提供了存储和操作对象的...
* 提高了程序的性能:Java 集合框架提供的集合类和遍历集合的方式,提高了程序的性能和响应速度。 Java 集合框架的应用 Java 集合框架的应用非常广泛,包括: * 数据存储:Java 集合框架可以用于存储和操作大规模...
本章我们将概览Java中最常用的集合类,特别是Collection接口及其子接口List,以及Map接口。 首先,Collection接口是所有集合类的基础,它定义了对一组对象的基本操作。List接口是Collection的一个子接口,它允许...
或者使用并发集合来替代传统的集合类,这样可以在多线程环境下实现更好的性能。 在实际操作中,Java同步线程模型的应用需要特别注意线程的创建和管理。合理设置系统进程数目、控制上下文切换次数以及线程的合理分工...
HashMap作为Java中最常用的集合类之一,它的实现原理与高效性能深受开发者喜爱。本文将深入探讨HashMap的概述、数据结构及其内部实现机制。 首先,HashMap是一个基于哈希表的Map接口的非同步实现,这意味着它在多...
内容包括单例模式的合理应用、静态变量的使用考量、对象创建与垃圾回收策略...性能差异、多线程环境下集合类的选择、HashMap的合理创建、资源释放的finally块、移位运算符的使用优化、StringBuffer的容量确定等45个细节...
Java性能调优,特别是关于垃圾回收机制的分析和指导,是优化Java应用程序的关键环节。Java的垃圾回收(Garbage Collection, GC)是自动管理内存的一种机制,它负责识别并清理那些不再使用的对象,以释放内存资源。...
### Java列表对象的性能分析与测试 #### 一、引言 在Java编程语言中,`java.util.List`接口提供了一种存储有序集合的方式。它包括了多种实现类,如`LinkedList`、`Vector`和`ArrayList`等。每种实现都有其独特的...
此外,利用现代Java虚拟机(如Java 8及以上版本)提供的并发工具,比如java.util.concurrent包中的并发集合和原子类,可以在很多情况下替代传统的同步块,从而减少死锁的风险。 Java同步线程模型的另一个应用场景是...
6. **选择合适的包装类型和基本类型**:包装类型适用于需要对象的场景,如集合类。而在其他情况下,使用基本类型可以减少不必要的对象创建,提高性能。 7. **谨慎使用synchronized**:同步操作会带来性能开销,可能...
开发者需要仔细分析应用中可能出现的同步问题,并设计合理的同步策略。 例如,对于一个简单的计数器应用程序,如果多个线程要增加计数器的值,就需要同步访问计数器变量: ```csharp private readonly object ...
这个名为"各类工具集合"的压缩包显然包含了多种用途的实用工具,其中包括时间转换工具、MySQL客户端以及网络分析软件Wireshark。下面将详细阐述这些工具的重要性和使用场景。 1. **时间转换工具**: 时间转换工具...
10. **多线程注入类**:多线程编程允许同时执行多个任务,而注入类则允许在运行时将代码插入到其他进程中,常用于自动化测试、性能分析等场景。 11. **脚本控制类**:脚本控制类提供了运行和管理脚本的能力,如解释...
5. **线程安全**:非同步的集合类在多线程环境下可能会引发问题,需注意线程安全问题和同步解决方案,如`ConcurrentHashMap`和`CopyOnWriteArrayList`。 通过对`JavaCollection`源码的深入分析,我们可以更好地理解...
但是,如果不需要线程安全性,使用`Dictionary, TValue>`等非线程安全的集合可能会提供更好的性能。 #### 1.9 避免使用ArrayList `ArrayList`是一个动态数组,但它的性能不如泛型集合如`List<T>`。后者提供了更好...
在准备大数据面试的过程中,Java基础是必不可少的一部分,尤其聚焦于集合类、多线程和JVM这三大核心领域。下面将分别对这三个方面进行深入探讨。 **一、Java集合类** Java集合框架是处理对象组的重要工具,它包括...