Java 同步(vector<;vector>;)是锁定所有向量还是仅锁定存储它们的向量?

Java 同步(vector<;vector>;)是锁定所有向量还是仅锁定存储它们的向量?,java,vector,synchronized,Java,Vector,Synchronized,假设我有一些向量:v1,v2,v3 假设我还有一个向量,它保存着这些vList={v1,v2,v3} 如果我已同步(vList),这是否意味着v1、v2和v3也被锁定,还是只是锁定vList?由您决定锁保护的内容。如果您决定它锁定所有三个,那么它将锁定所有三个。只需在访问这些对象的所有代码中反映该决策 锁和对象之间的关系是一个代码设计概念,必须反映在处理锁定对象的所有代码中。为了避免竞争条件和其他bug,程序员可以使用锁来保护对象。如果我们打算在保持锁“X”的同时执行对对象“Y”的所有访问,那么

假设我有一些向量:v1,v2,v3

假设我还有一个向量,它保存着这些vList={v1,v2,v3}


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

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

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


如果所有访问“v1”的代码在访问时都持有“vList”锁,那么“vList”将锁定“v1”。如果有一些代码访问“v1”而不持有“vList”锁,“vList”不会锁定“v1”。

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

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

如果所有访问“v1”的代码在访问时都持有“vList”锁,那么“vList”将锁定“v1”。如果有一些代码访问“v1”而不持有“vList”锁,“vList”不会锁定“v1”。

每个
向量
仅使其自身的内容线程安全:

  • Vector
    锁定向量的向量,但不锁定单个向量
  • 它内部的每个
    向量
    都在锁定
    T
    本身的向量
换句话说,如果从向量向量内部获得两个
T
向量,并将这些向量赋予不同的线程,则可以同时访问向量,而不会使线程相互锁定

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

每个
向量
仅使其自己的内容线程安全:

  • Vector
    锁定向量的向量,但不锁定单个向量
  • 它内部的每个
    向量
    都在锁定
    T
    本身的向量
换句话说,如果从向量向量内部获得两个
T
向量,并将这些向量赋予不同的线程,则可以同时访问向量,而不会使线程相互锁定


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

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

如果将其用于方法(
synchronized void foo()
),则只有一个线程可以访问此方法

如果将其用于对象(
synchronized(bar)
),则只有在该对象上拥有锁的线程才能进入关键区域

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

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

在行中同步多个对象也没有问题:

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

其中比较棘手的是级联同步,因为这可能导致:



最后但并非最不重要:

您不必锁定向量以使其成为threadsave,因为向量的每个方法都是用
synchronized
定义的(如图所示)。如果要编辑多个向量而不受其他线程的干扰,则只需设置附加锁。

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

如果将其用于方法(
synchronized void foo()
),则只有一个线程可以访问此方法

如果将其用于对象(
synchronized(bar)
),则只有在该对象上拥有锁的线程才能进入关键区域

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

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

在行中同步多个对象也没有问题:

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

其中比较棘手的是级联同步,因为这可能导致:



最后但并非最不重要:

您不必锁定向量以使其成为threadsave,因为向量的每个方法都是用
synchronized
定义的(如图所示)。如果你想编辑多个向量而不受其他线程的干扰,你只需要设置一个额外的锁。

那会导致灾难。那会导致灾难。我对你的意思有点困惑。同步(foo)不意味着Java有一些