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