同步(this)vs synchronize(MyClass.class)
可能重复:
.class的Java同步块
我正在阅读有关同步的文章 。 我对以下几点感到困惑,需要进一步澄清
1)用于同步块。 怎么样
synchronize(this){ // code }
不同于
synchronize(MyClass.class){ //code }
2)同步实例方法意味着线程必须获得对实例的独占锁定,而同步静态方法意味着线程必须获取整个类的锁定(如果我错了,请纠正我)。 因此,如果一个类有三个方法,其中一个是静态同步的,那么如果一个线程获得对该方法的锁定意味着它将获得对整个类的锁定,那么这意味着其他两个也将被锁定,没有其他方法将能够访问这两个方法,因为整个类都有锁?
MyClass.class
和this
是不同的东西,是对不同对象的不同引用。
this
– 是特定的这个类实例的引用,和
MyClass.class
– 是对MyClass
描述对象的引用。
这个同步块的不同之处在于,第一个将同步与MyClass
这个实例具体处理的所有线程,第二个同步将独立于调用此方法的对象的所有线程。
第一个例子(获取this
锁定)意味着在实例方法中使用,第二个例子(获取class
对象的锁定) – 在static
方法中。
如果一个线程获取MyClass.class
锁,则其他线程将不得不等待进入该块所在的static
方法的synchronized块。同时,所有线程将能够获取此特定实例的锁定类和执行实例方法。