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

San*_*mar 25 java synchronization

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

我正在阅读有关同步的文章.我对以下几点感到困惑,需要进一步澄清

1)用于同步块.怎么样

   synchronize(this){
    // code
   }
Run Code Online (Sandbox Code Playgroud)

不同于

   synchronize(MyClass.class){
    //code
   }
Run Code Online (Sandbox Code Playgroud)

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

And*_*niy 27

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

this - 是特定的这个类实例的引用,和

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

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


And*_*nov 11

第一个例子(获取锁定this)意味着在实例方法中使用,第二个例子(获取class对象的锁定) - 在static方法中.

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