0

我知道java中的同步方法是如何工作的。

假设我们在一个类中有 3 个同步方法。如果一个 Thread 访问 1 个可用方法,则另外 2 个被其他线程阻塞。

如果我们将方法 1 中的同步实现更改为:

synchronized (this) {...}

它是否仍然以相同的方式工作并阻止其他两种方法?

4

3 回答 3

2

这在 Java 教程部分Intrinsic Locks and Synchronization(强调我的)中进行了解释:

当线程调用同步方法时,它会自动获取该方法对象的内在锁,并在方法返回时释放它。即使返回是由未捕获的异常引起的,也会发生锁定释放。

所以,答案是肯定的。

于 2012-08-16T12:24:41.880 回答
1

是的。

关键字,当synchronized应用于方法时,相当于将方法的内容包装在synchronized(this).

规范说:

同步方法在执行之前获取监视器(第 17.1 节)。

对于类(静态)方法,使用与方法类的 Class 对象关联的监视器。

对于实例方法,使用与 this(调用该方法的对象)关联的监视器。

于 2012-08-16T12:23:48.257 回答
1

是的,它确实。

public synchronized void method() {...}

使用对象的内在锁 ( this),因此任何其他使用该锁的同步块:

synchronized(this) {...}

如果锁已经被持有,将会阻塞。

注意:如果一个方法是静态的,那画面就不一样了,因为锁已经没有this了,它是YourObject.class. 在下面的示例中,没有什么可以阻止线程 T1method在另一个线程 T2 运行时运行someOtherMethod,因为这两个部分不使用相同的锁:

public static synchronized void method() {...}

public void someOtherMethod() {
    synchronized(this) {
    }
}
于 2012-08-16T12:24:00.520 回答