29

可能重复:
.class 的 Java 同步块

我正在阅读一篇关于同步的文章。我对以下几点感到困惑,需要更多说明

1) 用于同步块。如何

   synchronize(this){
    // code
   }

不同于

   synchronize(MyClass.class){
    //code
   }

2)同步实例方法意味着线程必须获得实例的独占锁,而同步静态方法意味着线程必须获得整个类的锁(如果我错了,请纠正我)。因此,如果一个类具有三个方法,其中一个是静态同步的,那么如果一个线程在该方法上获得锁,那么这意味着它将在整个类上获得锁。那么这是否意味着其他两个也将被锁定,并且没有其他方法能够访问这两个方法,因为整个类都有锁定?

4

2 回答 2

34

MyClass.class并且this是不同的东西,它们是对不同对象的不同引用。

this- 是对该类的这个特定实例的引用,并且

MyClass.class- 是对MyClass描述对象的引用。

这些同步块的不同之处在于,第一个将同步具体处理实例的所有线程MyClass,第二个将同步所有线程,而与调用哪个方法的哪个对象无关。

于 2013-01-24T07:15:03.367 回答
12

第一个示例(获取锁this)用于实例方法,第二个示例(获取class对象锁)- 在static方法中。

如果一个线程获得锁MyClass.class,其他线程将不得不等待进入该块所在static方法的同步块。同时,所有线程将能够获得该类的特定实例的锁并执行实例方法。

于 2013-01-24T07:14:55.837 回答