"A synchronized block in Java is synchronized on some object" 是什么意思..?

What does "A synchronized block in Java is synchronized on some object" mean..?

我知道为了实现线程安全和同步,我们使用同步块或方法。
但我无法理解该声明-
"A synchronized block in Java is synchronized on some object"

任何现实世界的例子都会有所帮助。

3 次 synchronized 关键字的用法。


明确地:

final Object object = new Object();
synchronized(object) {

}

实例同步方法

synchronized void foo() {

}

它将使用当前实例作为监视器锁,等于:

void foo() {
    synchronized (this) {

    }
}

所以当你在不同的实例上调用foo时,它们不会相互影响。


Class 同步方法

class Exmaple {

    static synchronized void foo() {

    }

}

它将使用当前 class 对象作为监视器锁,等于:

class Exmaple {

    static void foo() {
        synchronized (Exmaple.class) {

        }
    }   
}

同步在执行同步块之前对对象进行锁定(对象级锁定或 Class 级锁定)。

Java 中的同步块因此在它获取锁的对象上同步。

例如:

synchronized (this)  // Lock on current object
synchronized (lockObject) // Lock on an object lockObject
synchronized(ClassA.class) // Lock on ClassA

synchronized的效果是一次只有一个线程可以执行同步代码。但如果我们看细节,这并不是全部事实。

假设我们有两个 Vectors AB 并且想从不同的线程调用各种方法。 Vector class 通过同步所有重要方法是线程安全的。当线程 T1 执行 A.add(5,"abc") 时,为什么要阻止另一个线程执行 B.get(5)?它们没有共同的数据元素,因此并行执行这两个调用不会有什么坏处。

这里出现了 "synchronized on A" 的概念:Vector 方法在 Vector 实例上同步,因此最多一个线程可以执行同步代码 给定矢量.

所以Vector A在A上同步,Vector B在B上同步。所以,没有两个线程可以并行操作Vector A,但是一个线程可以在A上工作,另一个线程独立地在B上工作。

  • 使用 synchronized(object) { ... } 构造,您可以决定要同步的对象。
  • 在实例方法上使用 synchronized 关键字,您可以获得当前 (this) 对象的同步,因此每个实例都会获得自己的同步。
  • 在静态方法上使用 synchronized 关键字,您可以在 class 上获得同步,因此您可以防止此 class 的所有其他 static synchronized 方法,独立于任何实例。