Java Vector Thread安全

Sma*_*y77 4 java vector thread-safety

有没有危险,如果我在我的服务器程序上使用一个Vector(java.util.Vector),当我从多个线程访问它只是为了阅读?(myvector .size().get()...)用于使用synchronized方法编写im.谢谢.

Ale*_*lev 15

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

if (vector.size() > 0) {
    System.out.println(vector.get(0));
}
Run Code Online (Sandbox Code Playgroud)

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

synchronized (vector) {
    if (vector.size() > 0) {
        System.out.println(vector.get(0));
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,这种"如果不是空"的操作是原子的,并且无竞争条件.


Den*_*gin 7

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