当前位置:首页 > 开发 > 编程语言 > Java > 正文

java集合的同步测试

发表于: 2012-07-07   作者:blackproof   来源:转载   浏览次数:
摘要: 前不久在给web项目做一个工具包,安全审计。 响应领导号召,为了提高效率不用线程安全的java集合,用如arraylist这样线程不安全的集合,而且自己不加线程控制,哪个servlet都可以向arraylist添加一条记录。 可是在下,怎么想都会有问题,所以多了一个超简单的demo,代码如下:     public static void main(String[]

前不久在给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的标志节点)(领导!!你就坑爹吧!!)

 

java集合的同步测试

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
java集合 Java集合框架 Collection接口API Iterator迭代器接口(遍历集合中的元素) Collection子接
-集合接口:6个接口(短虚线表示),表示不同集合类型,是集合框架的基础。   -抽象类:5个抽象类
http://www.cnblogs.com/yoyozhou/archive/2012/01/10/2318453.html java 集合 2012-01-10 19:17 by
在java中,集合相关的内容多放在 java.util 包里面。java的集合主要有Collection接口和Map接口,同
有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否 否 HashSet TreeSet 是(
1、Java容器类库的简化图,下面是集合类库更加完备的图。包括抽象类和遗留构件(不包括Queue的实现
JAVA的集合框架(Java Collection Framework)是JAVA的基础知识,在我们的开发过程中几乎是时时刻刻
1、Collection接口是集合接口树的根,定义了通用的API。 2、Set 不可以包含重复的元素。实现类为:H
集合包:Collection(存放单个对象),map(key-value) collection:List(支持放入重复对象),se
集合 1.整体继承关系图: 2.Collection接口详解: ①构造方法:有一个带有一个集合参数的构造方法。
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号