我知道java中的同步方法是如何工作的。
假设我们在一个类中有 3 个同步方法。如果一个 Thread 访问 1 个可用方法,则另外 2 个被其他线程阻塞。
如果我们将方法 1 中的同步实现更改为:
synchronized (this) {...}
它是否仍然以相同的方式工作并阻止其他两种方法?
我知道java中的同步方法是如何工作的。
假设我们在一个类中有 3 个同步方法。如果一个 Thread 访问 1 个可用方法,则另外 2 个被其他线程阻塞。
如果我们将方法 1 中的同步实现更改为:
synchronized (this) {...}
它是否仍然以相同的方式工作并阻止其他两种方法?
这在 Java 教程部分Intrinsic Locks and Synchronization(强调我的)中进行了解释:
当线程调用同步方法时,它会自动获取该方法对象的内在锁,并在方法返回时释放它。即使返回是由未捕获的异常引起的,也会发生锁定释放。
所以,答案是肯定的。
是的。
关键字,当synchronized
应用于方法时,相当于将方法的内容包装在synchronized(this)
.
规范说:
同步方法在执行之前获取监视器(第 17.1 节)。
对于类(静态)方法,使用与方法类的 Class 对象关联的监视器。
对于实例方法,使用与 this(调用该方法的对象)关联的监视器。
是的,它确实。
public synchronized void method() {...}
使用对象的内在锁 ( this
),因此任何其他使用该锁的同步块:
synchronized(this) {...}
如果锁已经被持有,将会阻塞。
注意:如果一个方法是静态的,那画面就不一样了,因为锁已经没有this
了,它是YourObject.class
. 在下面的示例中,没有什么可以阻止线程 T1method
在另一个线程 T2 运行时运行someOtherMethod
,因为这两个部分不使用相同的锁:
public static synchronized void method() {...}
public void someOtherMethod() {
synchronized(this) {
}
}