java矢量和线程安全

时间:2009-11-01 23:03:04

标签: java vector multithreading thread-safety

我想知道这段代码是否会有任何问题:

我有一个在许多线程之间共享的向量。每次线程必须从向量中添加/删除东西时,我都会在synchronized块下进行。但是,主线程有一个调用:

System.out.println("the vector's size: "+ vec.size());

不是synchronized

这会引起麻烦吗?

4 个答案:

答案 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替换为ArrayListArrayList的方法不是synchronized,因此您需要自己同步所有访问权限。

答案 3 :(得分:0)

请注意,您始终可以使用Collections.synchronizedCollection(Collection<T> c)静态方法获取集合的同步版本。