java向量与线程安全

wqsoz72f  于 2021-07-05  发布在  Java
关注(0)|答案(4)|浏览(335)

我想知道这个代码会不会有什么问题:
我有一个向量,它在许多线程之间共享。每次线程必须从向量中添加/删除内容时,我都在 synchronized 阻止。但是,主线程有一个调用:

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

哪个不是 synchronized .
这会引起麻烦吗?

des4xlb0

des4xlb01#

所有的向量方法本身都是同步的,所以只要您只是围绕一个方法进行同步,就不需要您自己的同步。如果您有几个方法调用,它们相互依赖,例如 vec.get(vec.size()-2) 要获取最后的第二个元素,必须使用自己的同步,否则,向量可能会在vec.size()和vec.get()之间变化。

k5hmc34c

k5hmc34c2#

每种方法 java.util.Vectorsynchronized ,因此这不会对只记录大小的对象造成任何问题。
为了提高性能,您最好更换 Vector 带着一个 ArrayList . 方法 ArrayList 不是 synchronized ,因此您需要自己同步所有访问。

eivgtgni

eivgtgni3#

请注意,通过使用 Collections.synchronizedCollection(Collection<T> c) 静态方法。。

pkbketx9

pkbketx94#

我猜你指的是 java.util.Vector .
事实上 Vector.size() 是同步的,并将返回与向量状态一致的值(当线程调用 size() 如果它返回42,那么在某个时间点,向量正好包含42个元素。
如果要在另一个线程的循环中添加项,则无法预测确切的大小,但出于监视目的,应该可以这样做。

相关问题