2013-01-24 123 views
21

可能重复:
Java Synchronized Block for .class同步(这)与同步(MyClass.class)

我是通过对同步的article读取。我对以下几点感到困惑,需要更多说明

1)用于同步块。如何

synchronize(this){ 
    // code 
    } 

synchronize(MyClass.class){ 
    //code 
    } 

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

回答

24

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

this - 是参照类的特定这种情况下,和

MyClass.class - 是参照MyClass描述对象。

该同步块的不同之处是,第一将同步与MyClass实例具体处理的所有线程,而第二个将独立地同步所有线程这些对象在其上该方法被调用。

9

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

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

+0

只有静态类的变量会被同步(MyClass.class)锁定吗? – tgkprog

+0

@tgkprog您不会同步变量本身,您可以通过方法同步对它们的访问。 'MyClass.class'只是一个对象,它可能(虽然我无法想象需要什么实际情况)来同步它上的实例方法,但通常这个范例用于静态方法。 –

+0

嗯我认为同步(MyClass.class)只锁定类中声明的静态变量。将不得不查看它。所以你说如果我有1000个我的班级的实例,每个实例有100个变量,他们都会被锁定? – tgkprog