java矢量和线程安全

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()之间改变.


fin*_*nnw 7

我假设你指的是java.util.Vector.

实际上Vector.size() 同步的并且将返回与向量的状态一致的值(当线程调用size()进入监视器时.)如果它返回42,那么在某个时间点向量包含正好42个元素.

如果您在另一个线程的循环中添加项目,那么您无法预测确切的大小,但它应该适用于监视目的.

  • 为"在某个时间点"+1.可能与语句周围的代码不完全一致.为此,您需要添加自己的同步. (3认同)