synchronized(this) vs synchronized(MyClass.class)

2022-09-01 11:51:59

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

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

  1. 对于同步块。如何

    synchronized (this) {
        // code
    }
    

    不同于

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


答案 1

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

this- 是对类的此特定实例的引用,并且

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

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


答案 2

第一个示例(获取锁定 )旨在用于实例方法,第二个示例(获取对象上的锁定)-- 在方法中。thisclassstatic

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


推荐