Guy*_*Guy 4 java multithreading vector thread-safety
我想知道这段代码是否会有任何问题:
我有一个在许多线程之间共享的向量.每次线程必须从向量中添加/删除东西时,我都会在synchronized块下进行.但是,主线程有一个调用:
System.out.println("the vector's size: "+ vec.size());
Run Code Online (Sandbox Code Playgroud)
不是synchronized.
这会引起麻烦吗?
jar*_*bjo 12
所有Vector方法本身都是同步的,因此只要您只围绕单个方法进行同步,就不需要自己的同步.如果你有几个方法调用,它们相互依赖,例如vec.get(vec.size()-2)得到第二个最后一个元素,你必须使用你自己的同步,否则,向量可能会在vec.size()和vec.get()之间改变.
我假设你指的是java.util.Vector.
实际上Vector.size() 是同步的并且将返回与向量的状态一致的值(当线程调用size()进入监视器时.)如果它返回42,那么在某个时间点向量包含正好42个元素.
如果您在另一个线程的循环中添加项目,那么您无法预测确切的大小,但它应该适用于监视目的.