我想知道这段代码是否会有任何问题:
我有一个在许多线程之间共享的向量。每次线程必须从向量中添加/删除东西时,我都会在synchronized
块下进行。但是,主线程有一个调用:
System.out.println("the vector's size: "+ vec.size());
不是synchronized
。
这会引起麻烦吗?
答案 0 :(得分:12)
所有Vector方法本身都是同步的,因此只要您只围绕单个方法进行同步,就不需要自己的同步。如果你有几个方法调用,它们相互依赖,例如像vec.get(vec.size()-2)
之类的东西来获得倒数第二个元素,你必须使用自己的同步,否则,向量可能会在vec.size()和vec.get()之间发生变化。
答案 1 :(得分:7)
我假设您指的是java.util.Vector
。
实际上Vector.size()
是同步的,并且会返回一个与向量状态一致的值(当调用size()
的线程进入监视器时。)如果它返回42,那么at某个时间点,矢量恰好包含42个元素。
如果您在另一个线程的循环中添加项目,那么您无法预测确切的大小,但它应该可以用于监视目的。
答案 2 :(得分:0)
java.util.Vector
的每个方法都是synchronized
,所以这不会对只记录大小的内容造成任何问题。
要提高效果,最好将Vector
替换为ArrayList
。 ArrayList
的方法不是synchronized
,因此您需要自己同步所有访问权限。
答案 3 :(得分:0)
请注意,您始终可以使用Collections.synchronizedCollection(Collection<T> c)
静态方法获取集合的同步版本。