我想知道这个代码会不会有什么问题:我有一个向量,它在许多线程之间共享。每次线程必须从向量中添加/删除内容时,我都在 synchronized 阻止。但是,主线程有一个调用:
synchronized
System.out.println("the vector's size: "+ vec.size());
哪个不是 synchronized .这会引起麻烦吗?
des4xlb01#
所有的向量方法本身都是同步的,所以只要您只是围绕一个方法进行同步,就不需要您自己的同步。如果您有几个方法调用,它们相互依赖,例如 vec.get(vec.size()-2) 要获取最后的第二个元素,必须使用自己的同步,否则,向量可能会在vec.size()和vec.get()之间变化。
vec.get(vec.size()-2)
k5hmc34c2#
每种方法 java.util.Vector 是 synchronized ,因此这不会对只记录大小的对象造成任何问题。为了提高性能,您最好更换 Vector 带着一个 ArrayList . 方法 ArrayList 不是 synchronized ,因此您需要自己同步所有访问。
java.util.Vector
Vector
ArrayList
eivgtgni3#
请注意,通过使用 Collections.synchronizedCollection(Collection<T> c) 静态方法。。
Collections.synchronizedCollection(Collection<T> c)
pkbketx94#
我猜你指的是 java.util.Vector .事实上 Vector.size() 是同步的,并将返回与向量状态一致的值(当线程调用 size() 如果它返回42,那么在某个时间点,向量正好包含42个元素。如果要在另一个线程的循环中添加项,则无法预测确切的大小,但出于监视目的,应该可以这样做。
Vector.size()
size()
4条答案
按热度按时间des4xlb01#
所有的向量方法本身都是同步的,所以只要您只是围绕一个方法进行同步,就不需要您自己的同步。如果您有几个方法调用,它们相互依赖,例如
vec.get(vec.size()-2)
要获取最后的第二个元素,必须使用自己的同步,否则,向量可能会在vec.size()和vec.get()之间变化。k5hmc34c2#
每种方法
java.util.Vector
是synchronized
,因此这不会对只记录大小的对象造成任何问题。为了提高性能,您最好更换
Vector
带着一个ArrayList
. 方法ArrayList
不是synchronized
,因此您需要自己同步所有访问。eivgtgni3#
请注意,通过使用
Collections.synchronizedCollection(Collection<T> c)
静态方法。。pkbketx94#
我猜你指的是
java.util.Vector
.事实上
Vector.size()
是同步的,并将返回与向量状态一致的值(当线程调用size()
如果它返回42,那么在某个时间点,向量正好包含42个元素。如果要在另一个线程的循环中添加项,则无法预测确切的大小,但出于监视目的,应该可以这样做。