synchronized(vector <vector>)是锁定所有向量还是仅存储它们的那个?</vector>

时间:2014-10-22 19:24:02

标签: java vector synchronized

说我有一些向量:v1,v2,v3

假设我还有一个包含这些vList = {v1,v2,v3}

的向量

如果我同步(vList),这是否意味着v1,v2和v3也被锁定或者只是锁定vList?

3 个答案:

答案 0 :(得分:3)

由您来决定锁保护的内容。如果你决定它锁定所有这三个,那么它将锁定所有这三个。只需在访问这些对象的所有代码中反映该决定。

锁和对象之间的关系是一个代码设计概念,必须反映在处理锁定对象的所有代码中。为了避免竞争条件和其他错误,程序员可以使用锁来保护对象。如果我们打算在保持锁“X”的同时执行对对象“Y”的所有访问,则我们说锁“X”锁定对象“Y”。由于只有一个线程可以保持锁定“X”,因此该规则确保一次只有一个线程访问对象“Y”。锁不知道或不关心它保护的对象。

如果访问“v1”的所有代码在访问时都持有“vList”锁,则“vList”锁定“v1”。如果有一些代码在没有保持“vList”锁的情况下访问“v1”,则“vList”不会锁定“v1”。

答案 1 :(得分:1)

每个Vector<T>只使用自己的内容线程安全:

  • Vector<Vector<T>>锁定向量的向量,但不锁定单个向量
  • 其中的每个Vector<T>锁定T本身的向量。

换句话说,如果从向量向量中得到两个T向量,并将这些向量提供给不同的线程,则可以同时访问向量,而不会将线程相互锁定

另一方面,如果您同时开始访问向量向量,则访问将是互斥的,因为向量是同步的。

答案 2 :(得分:1)

同步不会锁定对象!它标志着代码的关键部分。

如果将它用于方法(synchronized void foo()),则只有一个Thread可以访问此方法。

如果将它与对象(synchronized(bar))一起使用,则只有因此对象锁定的线程才能进入临界区。

这意味着同步&#39; bar&#39;要求每个想要进入该区域的线程(或任何其他同步的&#39; bar&#39;)请求锁定。如果他们没有获得它,他们将被阻止,直到拥有锁的线程释放它。

这意味着如果所有向量仅在一个变量上同步的块中使用,这通常就足够了。

连续多个对象同步也没问题:

synchronized(bar){..} synchronized(foo){..}


它变得棘手的是级联同步,因为这可能导致deadlocks

synchronized(bar){
   synchronized(foo){..}
}



最后但同样重要的是:
您不必锁定Vector以使其成为线程,因为每个vector方法都是使用synchronized定义的(如here所示)。如果要编辑多个Vector而不受其他线程的干扰,则只需设置一个额外的锁。