是否存在任何危险,如果我在我的服务器程序上使用一个Vector(java.util.Vector),当我从多个线程访问它时只能读取? (myvector .size()。get()...)用于使用synchronized方法编写im。谢谢。
答案 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方法是同步的),但是如果你想获得更好的性能,你应该尝试使用CopyOnWriteArrayList
或Collections.synchronizedList
。