"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 A
和 B
并且想从不同的线程调用各种方法。 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
方法,独立于任何实例。
我知道为了实现线程安全和同步,我们使用同步块或方法。
但我无法理解该声明-
"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 A
和 B
并且想从不同的线程调用各种方法。 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
方法,独立于任何实例。