说我有一些向量:v1,v2,v3
假设我还有一个包含这些vList = {v1,v2,v3}
的向量如果我同步(vList),这是否意味着v1,v2和v3也被锁定或者只是锁定vList?
答案 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而不受其他线程的干扰,则只需设置一个额外的锁。