在多线程的环境中,存在一个问题,就是多个线程同时访问一个资源(比如一个ArrayList),这会引起“共享冲突”
假设一个场景:
某线程往某元素特别多的ArrayList追加元素(add),此时ArrayList正好到了它数组的边界,那么它需要扩大数组,采用的方法你可以去看源代码,会有一个拷贝数组的操作。这个动作可能非常慢,那么它有可能正好执行到一半的时候,被JVM调度到休息状态。而此时如果正好又有一个线程来删除某元素(remove)。结果是2个线程对这个ArrayList的操作将使得它变得乱七八糟。
这就是“共享冲突”。
为了克服“共享冲突”,引入了“同步”机制,也就是“锁”机制,某线程要操作对象的时候,给它加把锁,告诉其他线程,“我正在动它,你们等着”。这样,即使它被调度到休息状态,也不会有其他线程来动这个对象,直到它解锁。
这就是“线程安全”。
除了因为“同步”而影响了一定的效率外,之所以不用Vector的原因在于List更好的反应了面向对象的设计原则之一:面向接口编程,List是接口,可以有不同的实现( ArrayList就是其中的一个实现 ),这样用List的好处在于可以屏蔽具体的实现而降低耦合度。而sun之所以要引入 List的原因我个人认为就是在于Vector在设计上没有体现出这个面向对象的原则。包括现在基本都用Map而不用HashTable也是如此
分享到:
相关推荐
- **线程安全性**:`Vector`和`HashTable`是线程安全的,而`ArrayList`和`HashMap`不是。在多线程环境下,`ArrayList`和`HashMap`需要通过同步机制来保证数据一致性。 - **存储方式**:`List`接口的实现(如`...
1. `Vector`:`ArrayList`的线程安全版本,所有操作都是同步的,但是性能较差,因为每次操作都需要获取和释放锁。 2. `HashTable`:`HashMap`的线程安全版本,同样所有操作都是同步的,效率较低,不适合高并发场景。...
Vector与ArrayList类似,但它提供了一种线程安全的实现,这意味着在多线程环境中,多个线程可以同时访问和修改Vector,而不会导致数据不一致。然而,由于其同步机制,Vector的性能通常低于ArrayList。 3. Map接口与...
- Vector 和 ArrayList 都实现了 List 接口,其中 Vector 是线程安全的,而 ArrayList 不是。ArrayList 在插入和查找性能上通常优于 Vector,因为 Vector 的同步操作会带来额外的性能开销。 - LinkedList 实现了 ...
它和ArrayList一样,都是基于数组实现的,但是 Vector 是线程同步的,即线程安全的。在本文中,我们将深入分析 Vector 的底层结构和源码,探索它的实现机理和使用场景。 1. Vector 的基本介绍 Vector 类的定义说明...
### Java容器类详解:List、ArrayList、Vector及Map、HashTable应用 #### 一、Java容器类概述 在Java中,容器类(也称为集合类)主要用于存储和管理对象。Java SDK提供了一系列内置容器类,它们位于`java.util`...
- **Vector**: Vector 类似于 ArrayList,但它是线程同步的,这意味着多个线程可以安全地访问同一个 Vector 对象。然而,这种同步也会带来性能上的开销。Vector 同样提供了 `add()`、`remove()` 和 `insert()` 方法...
总的来说,`Vector`集合在Java中扮演了一个历史角色,它提供了一种线程安全的动态数组实现,虽然现代编程更多倾向于使用非同步的`ArrayList`,但理解`Vector`的特性和使用方法仍然对Java开发者具有价值。在设计多...
- 在多线程环境中,如果需要线程安全的动态数组,可以选择Vector,但应考虑其性能影响,也可以考虑使用`Collections.synchronizedList(List<T> list)`将ArrayList转换为线程安全的列表,或者使用`...
1. **线程安全**:`Vector`类的所有操作都是线程安全的,因为它在每个操作上都使用了同步锁。这意味着在多线程环境中,多个线程可以安全地读写同一个`Vector`实例,而不会导致数据不一致。这是与`ArrayList`的一个...
与`ArrayList`不同,`Vector`在多线程环境中能确保数据的一致性和安全性,这主要得益于它的方法大多都是同步的(synchronized)。`Vector`继承自`AbstractList`,实现了`List`、`RandomAccess`、`Cloneable`和`...
* ArrayList 的性能比 Vector 高,因为 Vector 需要同步锁机制来保证线程安全。 * ArrayList 可以存储 null 值,而 Vector 不能存储 null 值。 ArrayList 是 Java 中的一种非常有用的动态数组,它提供了很多有用的...
ArrayList和Vector之间的主要区别在于线程安全性和性能。ArrayList适合于非线程安全且对性能要求较高的环境,而Vector则适合于需要保证线程安全的场景,但其性能较低。 至于Hashtable,它是一个过时的类,现在通常...
线程安全的定义是指,当多个线程访问一个对象时,如果不需要考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,...
Vector是List接口下的一种线程安全的集合实现,Vector的所有方法都是同步的,而ArrayList和LinkedList不是线程安全的。因此,如果需要在多线程环境下使用List,应该选择Vector或使用Collections.synchronizedList()...
`Vector`类的所有公共方法都是同步的,这意味着它们在多线程环境中是线程安全的。相比之下,`ArrayList`不是线程安全的,所以在多线程环境下使用`ArrayList`时需要手动添加同步机制。 4. 性能比较: - `Vector`...
1. **线程安全性**:`Vector`的所有方法都是同步的,这意味着它们可以在多线程环境中安全地使用而不会导致数据不一致的问题。 2. **自动增长策略**:`Vector`会根据需要自动增加其内部数组的大小。当向`Vector`添加...
总之,选择`Vector`可能是出于对线程安全的需求,但在现代Java编程中,考虑到性能和最佳实践,我们可能会推荐使用其他更适合的并发集合类,或者结合`Collections.synchronizedList()`等工具来手动同步`ArrayList`。...