来自不同 类 的同步语句

Synchronized statements from different classes

我有两个实现接口 A 的 类 B 和 C。在这两个 类 中都存在一个带有需要同步的语句的方法。我有这个:

    class B implements A {
         @Override
         public void method(){
           //some code here
           synchronized (this.getClass()) {
             //some code here
           }    
        }
    }



        class C implements A {
             @Override
             public void method(){
               //some code here
               synchronized (this.getClass()) {
                 //some code here
               }    
            }
        }   

我需要同步两个 类 中的语句,但 this.getClass return 不同 类 并且它可以同时执行。我怎样才能同步这两个来自不同 类 的语句,使其同时只执行一次?

method() 的两个实现都可以访问的某些其他对象上同步。

class D {
    public static final Object SYNC_OBJ = new Object();
}

class B implements A {
     @Override
     public void method(){
       //some code here
       synchronized (D.SYNC_OBJ) {
         //some code here
       }    
    }
}

class C implements A {
     @Override
     public void method(){
       //some code here
       synchronized (D.SYNC_OBJ) {
         //some code here
       }    
    }
}

需要同步它们的最可能原因是它们将访问一些公共对象。如果是,则同步该对象。

如果没有,如果你控制接口A,你可以添加:

public static final Object LOCK = new Object();

并让它们在 A.LOCK 上同步。

java 中的同步块在某些对象上同步。在同一对象引用上同步的同步块一次只允许 1 个线程。其他将被阻止直到它离开。因此,对这两种方法使用相同的对象引用。 https://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

您可以在 A 中声明一个共享监视器对象,例如:

static final Object MONITOR = new Object();

然后在BC中使用synchronized(MONITOR)

您无需引入新的 class/variable 即可轻松修改您的代码以完全按照您的意愿进行操作(假设您希望同步 A 的所有实现):

synchronized (A.class) {
    // do something
}

但这不是一个好的解决方案。正确的做法是使用锁。