大家都知道Vector是线程安全的,ArrayList是不安全的, 现在测试下ArrayList怎么个不安全法
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
public class HelloThread implements Runnable {
List<String> v = new ArrayList<String>();
// Vector<String> v = new Vector<String>();
// synchronized
public void run() {
try {
while (true) {
System.out.println(Thread.currentThread().getName() + " list size is " + v.size());
Thread.sleep(3);
v.add("tristan");
if (v.size() > 100) {
System.exit(1);
}
}
} catch (Exception e) {
System.err.println(Thread.currentThread().getName());
e.printStackTrace();
System.err.println("v.size(): " + v.size());
System.exit(-1);
}
}
public static void main(String args[]) throws InterruptedException {
HelloThread hello1 = new HelloThread();
Thread h1 = new Thread(hello1);
Thread h2 = new Thread(hello1);
Thread h3 = new Thread(hello1);
Thread h4 = new Thread(hello1);
Thread h5 = new Thread(hello1);
Thread h6 = new Thread(hello1);
Thread h7 = new Thread(hello1);
Thread h8 = new Thread(hello1);
Thread h9 = new Thread(hello1);
h1.start();
h2.start();
h3.start();
h4.start();
h5.start();
h6.start();
h7.start();
h8.start();
h9.start();
}
}
运行多次可以发现ArrayList有很大的报错概率, Vector则不会,
如何在run 方法上加上同步锁那也不会出现问题, 所以ArrayList的非线程安全性就体现在这里, 多个线程同时操作时可能会出现数组越界的异常。
再来看ArrayList和Vector的源代码,可以发现ArrayList的add方法没有同步锁,而Vector则有
add 方法不是原子性的操作,需要将数组扩充后,再放值,所以会出现问题
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
以后在成员变量中尽量用Vector, 临时变量用ArrayList
分享到:
相关推荐
ArrayList LinkedList Vector 区别 ArrayList、LinkedList、Vector 是 Java 中常用的数据结构实现类,它们都实现了 List 接口,但它们在存储方式、性能、线程安全性等方面有着不同特点。 首先,ArrayList 和 ...
在Java编程语言中,ArrayList、LinkedList和Vector是三种常见的动态数组实现,它们都在java.util包中,用于存储和管理对象的集合。这三个类都实现了List接口,提供了多种操作方法,但它们在内部实现和性能特性上有所...
在Java编程语言中,集合框架是处理对象数组的重要工具,其中`List`、`ArrayList`、`Vector`、`HashTable`和`HashMap`是五个关键的接口和类,它们各有不同的特性和用途。以下是这些概念的详细解释: 1. **List接口**...
ArrayList、Vector、LinkedList 的区别 在 Java 集合框架中,ArrayList、Vector、LinkedList 是三个常用的 List 实现类,虽然它们都实现了 List 接口,但是它们在继承关系、实现接口、底层数据结构、扩容机制等方面...
ArrayList、LinkedList和Vector是三种常见的动态数组实现,它们各自有特定的特性和使用场景。这里我们将深入探讨这三个类的性能对比,以及它们在不同操作下的表现。 ArrayList是基于动态数组实现的,它提供了随机...
List、ArrayList、Vector及map、HashTable、HashMap分别的区别 List、ArrayList、Vector及map、HashTable、HashMap是Java容器类中的几个重要的接口和实现类,了解它们之间的区别是非常重要的。 首先,我们来看List...
Java容器类List、ArrayList、Vector及map、HashTable应用 List、ArrayList、Vector及map、HashTable是Java中常用的容器类,它们都继承自Collection接口,并提供了不同的实现方式和特点。在实际开发中,选择合适的...
在Java编程语言中,ArrayList和Vector是两种常用的动态数组实现,它们都属于集合框架的一部分,用于存储和操作对象。虽然它们在用途上相似,但在性能、线程安全性和同步机制等方面存在显著区别。以下是关于ArrayList...
ArrayList、LinkList和Vector的区别 ArrayList、LinkList和Vector是Java中三个常用的集合类,它们都实现了List接口,但是在实现方式和性能上有所不同。 ArrayList ArrayList是使用数组方式存储数据的,数组元素数...
### ArrayList、Vector、LinkedList 的区别与用法详解 在Java编程中,选择合适的数据结构对于程序的性能至关重要。本文将深入探讨ArrayList、Vector和LinkedList三种集合类的特点与使用场景,帮助开发者更好地理解...
在Java编程语言中,ArrayList、Vector和LinkedList是三种常见的动态数组实现,它们都属于集合框架中的List接口。这里我们将深入探讨这三种数据结构的源码,理解它们的内部实现、性能特性和适用场景。 首先,...
ArrayList 和 Vector 的区别和常用方法
Java容器集合(equals和hashCode+基础数据结构+ArrayList+Vector和LinkedList) Java容器集合是Java中的一种基础数据结构,用于存储和管理数据。其中,equals和hashCode方法是Java容器集合中两个非常重要的方法,...
Java 中 ArrayList 的使用方法以及与 Vector 的对比 ArrayList 是 Java 中的一种动态数组,它提供了很多有用的特性,例如动态地增加和减少元素,实现了 ICollection 和 IList 接口,灵活的设置数组的大小等。下面...
### Vector 与 ArrayList 的区别详解 #### 一、前言 在 Java 集合框架中,`Vector` 和 `ArrayList` 是两种常用的动态数组实现。它们提供了灵活的数据存储方式,能够根据需要自动调整大小。然而,这两种类型的列表...
Vector与ArrayList类似,但它提供了一种线程安全的实现,这意味着在多线程环境中,多个线程可以同时访问和修改Vector,而不会导致数据不一致。然而,由于其同步机制,Vector的性能通常低于ArrayList。 3. Map接口与...
为什么ArrayList,Vector等都不支持循环中remove1 Vector 直接删除2 Vector 遍历元素2.1 for循环遍历2.2 迭代器循环2.3 任意方向遍历2.4 Vector的foreach3. Vector迭代器删除4. Vector不使用迭代器删除元素5. Vector...
比较分析Vector、ArrayList和hashtable hashmap数据结构
在Java编程语言中,ArrayList、Hashtable和Vector是三种常见的数据结构,它们都用于存储和管理对象,但各有特点和适用场景。以下是对这三个容器的详细解释: ArrayList是Java集合框架中的一部分,它实现了List接口...