ArrayList中的线程安全性

12 浏览
0 Comments

ArrayList中的线程安全性

为什么Java中的ArrayList类没有实现线程安全,而Vector类却实现了线程安全?是否有特殊原因导致ArrayList没有实现线程安全?

0
0 Comments

(Thread Safety in ArrayList) - 原因和解决方法

在Java中,Vector类被认为是过时或被废弃的,原因是它在每个操作中都进行同步。这通常不是我们想要的行为。一般情况下,我们希望对一整个操作序列进行同步。同步每个操作既不安全(例如,如果在迭代Vector时,仍然需要锁定以避免其他线程同时更改集合,否则会导致ConcurrentModificationException异常),而且速度较慢(为什么重复锁定,一次就足够了)。

当然,即使在不需要同步的情况下,它也会有锁定的开销。基本上,这是大多数情况下同步的一个非常有缺陷的方法。正如Brian Henk先生指出的,您可以使用诸如Collections.synchronizedList之类的方法来装饰一个集合 - Vector结合了“调整大小的数组”集合实现和“每个操作同步”的特性,这是设计不良的另一个例子;而装饰方法则能更清晰地分离责任。

值得一提的是(关于性能的论点),如果JVM(对于Java 6+)通过逃逸分析确定同步是不必要的,那么就不会使用同步。但显然,这仅适用于可以确定的情况。

因此,为了解决Vector类的这个问题,可以使用Collections类中的synchronizedList方法来装饰ArrayList,以实现线程安全。这样做的好处是,只在需要时才进行同步,避免了不必要的开销和较低的性能。

0