如果我在从多个线程访问时仅用于读取的情况下,在我的服务器程序中使用一个Vector(java.util.Vector),是否存在任何危险?(myvector .size() .get() ...)对于写入,我使用同步方法。谢谢。
如果我在从多个线程访问时仅用于读取的情况下,在我的服务器程序中使用一个Vector(java.util.Vector),是否存在任何危险?(myvector .size() .get() ...)对于写入,我使用同步方法。谢谢。
如上所述,由于使用了synchronized
修饰符,Vector
的每种方法本身都是线程安全的。 但是,如果您需要进行一些复杂的操作,例如基于与同一vector
相关的条件的get()
或add()
,则该操作不是线程安全的。请参见下面的示例:
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));
}
}
现在这个“获取非空值”操作是原子的,没有竞态条件。
Vector是一个线程安全的集合 - 默认情况下它的所有方法都是同步的。这就是为什么建议使用ArrayList代替 - 它不是线程安全的,因此对于单线程应用程序会有更好的性能。
向量类是线程安全的(大小,获取和设置方法都是同步的),但如果您想获得更好的性能,应该尝试使用CopyOnWriteArrayList
或Collections.synchronizedList
。
synchronized
方法,那么它不是几乎相同吗?即使没有锁定/阻塞,synchronized
机制是否会增加这样的开销? - Nom1fan