3 回答
TA贡献1789条经验 获得超8个赞
同步关键字的 3 种用法。
明确:
final Object object = new Object();
synchronized(object) {
}
实例同步方法
synchronized void foo() {
}
它将使用当前实例作为监视器锁,它等于:
void foo() {
synchronized (this) {
}
}
所以当你调用foo不同的实例时,它们不会相互影响。
类同步方法
class Exmaple {
static synchronized void foo() {
}
}
它将使用当前类对象作为监视器锁,它等于:
class Exmaple {
static void foo() {
synchronized (Exmaple.class) {
}
}
}
TA贡献1809条经验 获得超8个赞
其效果synchronized
是一次只有一个线程可以执行同步代码。但如果我们看细节,这并不是全部的真相。
假设我们有两个 VectorsA
并且B
想要从不同的线程调用各种方法。Vector
通过同步所有重要方法,该类是线程安全的。当线程 T1 执行时A.add(5,"abc")
,为什么要阻止另一个线程执行B.get(5)
?它们没有共同的数据元素,所以并行执行两个调用不会有什么坏处。
这里出现了“在 A 上同步”的概念:Vector
方法在Vector
实例上同步,因此最多一个线程可以为任何给定的 Vector执行同步代码。
所以向量 A 在 A 上同步,向量 B 在 B 上同步。 因此,没有两个线程可以并行操作向量 A,但一个线程可以在 A 上工作,另一个线程在 B 上独立工作。
通过
synchronized(object) { ... }
构造,您可以决定要同步的对象。synchronized
在实例方法上使用关键字,可以在当前 (this
) 对象上获得同步,因此每个实例都有自己的同步。synchronized
在静态方法上使用关键字,您可以获得类的同步,因此您可以不受static synchronized
此类的所有其他方法的影响,独立于任何实例。
TA贡献1866条经验 获得超5个赞
同步在执行同步块之前对对象进行锁定(对象级锁定或类级锁定)。
因此,Java 中的同步块在它获得锁的对象上是同步的。
例如:
synchronized (this) // Lock on current object
synchronized (lockObject) // Lock on an object lockObject
synchronized(ClassA.class) // Lock on ClassA
添加回答
举报