Java Vector Thread安全

时间:2014-04-23 13:35:54

标签: java vector thread-safety

是否存在任何危险,如果我在我的服务器程序上使用一个Vector(java.util.Vector),当我从多个线程访问它时只能读取? (myvector .size()。get()...)用于使用synchronized方法编写im。谢谢。

4 个答案:

答案 0 :(得分:12)

如上所述,由于Vector修饰符,synchronized的每个方法都是自己的线程安全的。但是,如果您需要一些复杂的操作,例如基于与同一get()相关的条件的add()vector,则这不是线程安全的。见下面的例子:

if (vector.size() > 0) {
    System.out.println(vector.get(0));
}

此代码的竞争条件介于size()get()之间 - 在我们的线程验证向量不为空之后,其他线程可能会更改向量的大小,因此调用get()可能会返回意外结果。为避免这种情况,上面的示例应该像这样更改:

synchronized (vector) {
    if (vector.size() > 0) {
        System.out.println(vector.get(0));
    }
}

现在这个"如果不是空的"操作是原子的,无竞争条件。

答案 1 :(得分:8)

Vector 是一个线程安全的集合 - 它的所有方法都是同步的。这就是为什么建议使用 ArrayList - 它不是线程安全的,这会为单线程应用程序带来更好的性能。

答案 2 :(得分:3)

java.util.Vector方法全部同步。因此,从多个线程中使用它是安全的#34;如果需要read-evaluate-write过程是原子的,则只需要进行同步。同步您自己的方法并不一定会使您的代码在这些情况下对线程安全。如果共享状态是Vector对象,那么您需要在Vector的实例上进行同步,而不是在您自己的类的实例上进行同步。

答案 3 :(得分:1)

Vector类是线程安全的(size,get,set方法是同步的),但是如果你想获得更好的性能,你应该尝试使用CopyOnWriteArrayListCollections.synchronizedList