前不久在给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集合框架的行为,以满足个性化或特定业务场景的功能需求。以下是对"java自定义集合类"这一主题的详细解释。 首先,Java集合框架包括接口(如List、Set、Map)和实现这些...
本测试主要针对Java集合知识进行考核,包括对象数组、集合与数组的区别、集合操作方法、并发修改异常处理、以及ArrayList、LinkedList和Vector等具体集合类的特点。 1. 对象数组是Java中的一种数据结构,它存储的是...
Java集合框架是Java编程语言中处理对象集合的一套接口和类。该框架提供了用于存储和操作集合的标准方法。在Java集合框架中,基本的接口分为两大类:Collection和Map。 Collection接口用于表示一组对象,称为其元素...
Java集合框架是面试中常考的部分,包括List、Set、Queue和Map接口,以及ArrayList、LinkedList、HashSet、HashMap等实现类: 1. 集合特性:线程安全、是否允许重复元素、排序规则等。 2. 遍历方式:迭代器、增强for...
这里我们根据提供的测试题内容,来深入探讨Java集合框架的一些关键知识点。 1. **对象数组**:对象数组是引用数据类型,它存储的是对象的引用而非实际对象。这意味着当你创建一个对象数组时,数组中每个元素都是...
在Java集合知识测试中,涉及到了多个关键概念和方法,以下是对这些知识点的详细解释: 1. **对象数组**:对象数组是Java中的引用数据类型,存储的是对象的引用,而不是对象本身。这意味着数组中的每个元素都是指向...
在Java中,线程安全的集合主要分为三类:同步集合、并发集合和不可变集合。 1. 同步集合(Synchronized Collections): 这些是基于非线程安全的集合(如ArrayList、HashMap)通过`Collections.synchronized*`方法...
Java集合框架是Java编程语言中用于处理数据结构的基础框架,它为程序员提供了大量集合类,用于存储和操作对象集合。Java集合框架不仅提高了数据处理效率,还简化了数据结构的操作,使得Java程序在处理大量数据时能够...
总的来说,处理多线程环境中的Java集合类时,开发者需要了解各种集合的线程安全特性,并根据具体需求选择合适的数据结构和同步策略,以确保程序的正确性和性能。在迭代过程中尤其要注意避免修改集合,或者使用能够...
在Java集合框架中,提供了多种数据结构用于存储和操作数据集合,使得我们可以在处理数据时更加灵活和高效。Java集合框架中的主要接口和类可以大致分为Collection接口及其子接口List、Set和Map。 **Collection接口**...
3. **集合框架**:Java集合框架包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)和Map(如HashMap和TreeMap)接口,以及它们的实现类。了解它们的特点和应用场景,如List的有序性和可重复性,Set的...
根据提供的文件信息:“Java常用开发工具集合”,我们可以深入探讨一系列对于Java开发者来说非常重要的工具和技术。这些工具在软件开发过程中扮演着不可或缺的角色,能够极大地提高开发效率、简化复杂任务,并帮助...
这些知识点涵盖了Java程序员的基础知识和技能,对于准备Java笔试题大集合及各大公司的笔试题来说,这些都是必须掌握的。通过深入学习和实践,可以提升解决问题的能力,为面试和实际工作打下坚实基础。
Java集合框架是Java编程语言中的核心部分,它提供了数据结构和对象组织的高效工具,是面试中经常被考察的知识点。...通过这份面试题集,你可以系统地复习和测试自己的Java集合框架知识,提升面试表现。
在这个"java 网络编程 代码集合"中,包含了多个示例项目,覆盖了从基础的TCP/IP通信到高级的RMI(远程方法调用)以及SMTP(简单邮件传输协议)的应用。下面将对这些知识点进行详细解释。 1. **TCP/ECHO**:TCP...
3. **集合框架**:Java集合框架包括List、Set、Queue、Map等接口,以及ArrayList、LinkedList、HashSet、HashMap等实现类。试题可能会要求理解它们之间的区别,以及如何选择合适的集合类型。 4. **多线程**:Java的...
本资源集合提供了一系列的Java面试题集,旨在帮助求职者充分准备,提高成功获得职位的机会。 《JAVA综合面试题》可能涵盖了Java的基础知识、进阶特性以及实际应用等多个方面。这通常包括但不限于: 1. **Java基础*...