是不是java中的synchronized块获取了整个对象锁?

时间:2012-08-16 12:21:14

标签: java multithreading synchronization synchronized

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

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

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

synchronized (this) {...}

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

3 个答案:

答案 0 :(得分:2)

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

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

所以,答案是肯定的。

答案 1 :(得分:1)

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

spec says

  

同步方法在执行之前获取监视器(第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) {
    }
}