同步(this)vs synchronize(MyClass.class)

时间:2013-01-24 07:11:52

标签: java synchronization

  

可能重复:
  Java Synchronized Block for .class

我正在阅读同步article。我对以下几点感到困惑,需要更多澄清

1)用于同步块。如何

   synchronize(this){
    // code
   }

不同
   synchronize(MyClass.class){
    //code
   }

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

2 个答案:

答案 0 :(得分:27)

MyClass.classthis是不同的东西,是对不同对象的不同引用。

this - 是对此类实例的引用,以及

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

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

答案 1 :(得分:10)

第一个示例(获取this上的锁定)意味着在实例方法中使用,第二个示例(在class对象上获取锁定) - 在static方法中。 / p>

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