`

java集合的同步测试

阅读更多

前不久在给web项目做一个工具包,安全审计。

响应领导号召,为了提高效率不用线程安全的java集合,用如arraylist这样线程不安全的集合,而且自己不加线程控制,哪个servlet都可以向arraylist添加一条记录。

可是在下,怎么想都会有问题,所以多了一个超简单的demo,代码如下:

 

 

public static void main(String[] args)
	{
		final ArrayList<String> list = new ArrayList<String>();
		ExecutorService exec = Executors.newCachedThreadPool();
		for(int i=0;i<20000;i++)
		{
			Thread t = new Thread(new Runnable()
			{
				
				@Override
				public void run()
				{
					// TODO Auto-generated method stub
//					synchronized (list)
//					{
						list.add("name");
//					}
//					System.out.println("add1");
					try
					{
						Thread.sleep(100);
					}
					catch (InterruptedException e)
					{
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
//					synchronized (list)
//					{
						list.add("name2");
//					}
//					System.out.println("add2");
				}
			}, i+"name");
			exec.execute(t);
		}

		try
		{
			Thread.sleep(10000);
		}
		catch (InterruptedException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("最终添加记录条数:"+list.size());
}

 结果,最终添加记录条数本应该为40000条,实际上是39900多条,总是差个几十条,但是jvm也不报错。

 

 当我把上边那个超简单的demo的synchronized语句打开时,结果为40000条,正确。

 

 不知道jvm是怎么实现滴,看了源码后,感觉是这样滴:

        添加记录的add方法,无非也是用index添加到集合中,当多线程同时添加时,假设index为10,第一条线程添加到index为10的值为chineseAV,但是index还没有加一的说,第二条记录就把index为10的值改为japaneseAV。所以导致最终记录数不对问题。

 

不知道删除集合的时候,不做线程控制会不会报错呢,结果是否正确(肯定有问题啊!!领导!!你就坑爹吧!!)

 

未完,接着本人测试一下其他集合,也希望各位大侠帮忙,分享下集合多线程的经验,不要让小弟挨个集合测试,

 

本人有测试过了linkedlist , linkedlist的源码分析如下http://blackproof.iteye.com/blog/1583470

 

所以如果不同步锁的话,肯定会造成链表连接混乱,所以add过程都共享并改变资源header(linkedlist的标志节点)(领导!!你就坑爹吧!!)

 

分享到:
评论
1 楼 Mikestl 2014-02-16  
Did you try LinkedBlockingQueue or ArrayBlockingQueue?

相关推荐

    java自定义集合类

    自定义集合类则是开发者根据特定需求扩展Java集合框架的行为,以满足个性化或特定业务场景的功能需求。以下是对"java自定义集合类"这一主题的详细解释。 首先,Java集合框架包括接口(如List、Set、Map)和实现这些...

    Java集合知识测试B.doc

    本测试主要针对Java集合知识进行考核,包括对象数组、集合与数组的区别、集合操作方法、并发修改异常处理、以及ArrayList、LinkedList和Vector等具体集合类的特点。 1. 对象数组是Java中的一种数据结构,它存储的是...

    java集合框架全面进阶.pdf

    Java集合框架是Java编程语言中处理对象集合的一套接口和类。该框架提供了用于存储和操作集合的标准方法。在Java集合框架中,基本的接口分为两大类:Collection和Map。 Collection接口用于表示一组对象,称为其元素...

    JAVA基础-集合

    本文旨在深入解析JAVA集合的基础概念、核心类以及它们的使用场景,帮助读者更好地理解和掌握JAVA集合。 #### 字符串与String类 字符串在JAVA中被视为一个不可变的对象,由`java.lang.String`类表示。这意味着一旦...

    java各公司笔试题集合

    Java集合框架是面试中常考的部分,包括List、Set、Queue和Map接口,以及ArrayList、LinkedList、HashSet、HashMap等实现类: 1. 集合特性:线程安全、是否允许重复元素、排序规则等。 2. 遍历方式:迭代器、增强for...

    Java集合知识测试B.pdf

    这里我们根据提供的测试题内容,来深入探讨Java集合框架的一些关键知识点。 1. **对象数组**:对象数组是引用数据类型,它存储的是对象的引用而非实际对象。这意味着当你创建一个对象数组时,数组中每个元素都是...

    Java集合知识测试B[借鉴].pdf

    在Java集合知识测试中,涉及到了多个关键概念和方法,以下是对这些知识点的详细解释: 1. **对象数组**:对象数组是Java中的引用数据类型,存储的是对象的引用,而不是对象本身。这意味着数组中的每个元素都是指向...

    Java多线程安全集合

    在Java中,线程安全的集合主要分为三类:同步集合、并发集合和不可变集合。 1. 同步集合(Synchronized Collections): 这些是基于非线程安全的集合(如ArrayList、HashMap)通过`Collections.synchronized*`方法...

    Java集合框架

    Java集合框架是Java编程语言中用于处理数据结构的基础框架,它为程序员提供了大量集合类,用于存储和操作对象集合。Java集合框架不仅提高了数据处理效率,还简化了数据结构的操作,使得Java程序在处理大量数据时能够...

    多线程中使用Java集合类.doc

    总的来说,处理多线程环境中的Java集合类时,开发者需要了解各种集合的线程安全特性,并根据具体需求选择合适的数据结构和同步策略,以确保程序的正确性和性能。在迭代过程中尤其要注意避免修改集合,或者使用能够...

    Java集合框架.pdf

    在Java集合框架中,提供了多种数据结构用于存储和操作数据集合,使得我们可以在处理数据时更加灵活和高效。Java集合框架中的主要接口和类可以大致分为Collection接口及其子接口List、Set和Map。 **Collection接口**...

    java笔试题大集合及答案

    3. **集合框架**:Java集合框架包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)和Map(如HashMap和TreeMap)接口,以及它们的实现类。了解它们的特点和应用场景,如List的有序性和可重复性,Set的...

    Java常用开发工具集合

    根据提供的文件信息:“Java常用开发工具集合”,我们可以深入探讨一系列对于Java开发者来说非常重要的工具和技术。这些工具在软件开发过程中扮演着不可或缺的角色,能够极大地提高开发效率、简化复杂任务,并帮助...

    java笔试题集合及答案

    这些知识点涵盖了Java程序员的基础知识和技能,对于准备Java笔试题大集合及各大公司的笔试题来说,这些都是必须掌握的。通过深入学习和实践,可以提升解决问题的能力,为面试和实际工作打下坚实基础。

    Java集合面试,共52道题目

    Java集合框架是Java编程语言中的核心部分,它提供了数据结构和对象组织的高效工具,是面试中经常被考察的知识点。...通过这份面试题集,你可以系统地复习和测试自己的Java集合框架知识,提升面试表现。

    java 网络编程 代码集合

    在这个"java 网络编程 代码集合"中,包含了多个示例项目,覆盖了从基础的TCP/IP通信到高级的RMI(远程方法调用)以及SMTP(简单邮件传输协议)的应用。下面将对这些知识点进行详细解释。 1. **TCP/ECHO**:TCP...

    java笔试题大集合及答案.rar

    3. **集合框架**:Java集合框架包括List、Set、Queue、Map等接口,以及ArrayList、LinkedList、HashSet、HashMap等实现类。试题可能会要求理解它们之间的区别,以及如何选择合适的集合类型。 4. **多线程**:Java的...

    JAVA面试书籍集合

    本资源集合提供了一系列的Java面试题集,旨在帮助求职者充分准备,提高成功获得职位的机会。 《JAVA综合面试题》可能涵盖了Java的基础知识、进阶特性以及实际应用等多个方面。这通常包括但不限于: 1. **Java基础*...

Global site tag (gtag.js) - Google Analytics