超类的Java同步私有方法

超类的Java同步私有方法,java,methods,synchronization,subclass,Java,Methods,Synchronization,Subclass,我有从基继承的类A和B Base有一个私有方法。A和B可能同时执行此方法 所以我想同步这个方法。如果我只是在签名中加上“synchronize”关键字,这会使A和B的执行同步(共享同一个锁)吗?或者我需要生成一个静态锁对象 对不起,有点困惑 Base有一个私有方法。A和B有可能执行此操作 方法 私有方法或字段不是由派生类继承的,所以您的问题的答案是否定的 根据评论编辑: 如果您有两个对象A和B,并且他们试图操作单例对象C,那么在这种情况下,应该是C进行同步,而不是A和B 多线程应用程序遵循的一般

我有从基继承的类A和B

Base有一个私有方法。A和B可能同时执行此方法

所以我想同步这个方法。如果我只是在签名中加上“synchronize”关键字,这会使A和B的执行同步(共享同一个锁)吗?或者我需要生成一个静态锁对象

对不起,有点困惑

Base有一个私有方法。A和B有可能执行此操作 方法

私有方法或字段不是由派生类继承的,所以您的问题的答案是否定的

根据评论编辑:

如果您有两个对象A和B,并且他们试图操作单例对象C,那么在这种情况下,应该是C进行同步,而不是A和B


多线程应用程序遵循的一般规则是,为了保持稳定状态而需要防止并发访问的每个类都负责正确使用同步,您不应该也不能期望方法的调用方以同步的方式访问对象状态。

如果您的代码看起来有点像下面的示例,那么它不是线程安全的,您需要包括某种形式的同步,以确保对私有方法的调用是原子的,并确保可见性。在这个简单的例子中,使
getNewCounter
同步就足够了。使用锁对象也可以

public class Base {
    private int counter;

    private void increment() {
        counter++;
    }
    protected int getNewCounter() {
        increment();
        return counter;
    }
}

public class A extends Base {
    public int aMethod() {
        return getNewCounter();
    }
}

public class B extends Base {
    public int anotherMethod() {
        return getNewCounter();
    }
}

从你的帖子中我能理解的是,你有一个带有私有方法的基类。您正在创建此基类或从基类派生的类的不同对象

现在,如果使私有方法同步,则不会使该方法的执行同步,因为您有多个对象。实例级锁定仅针对每个对象

例如,您有类Test的ObjectA和ObjectB,这两个对象都可以同时执行类Test中定义的私有方法say myMethod(),即使它是同步的,因为锁在对象上


希望这能有所帮助。

我知道的是,私人成员不是继承的。因此,类A和类B不能通过使用继承或创建基类的对象来调用此方法来访问此私有方法,除非基类中有一个公共方法可以访问此私有方法。

如果您有不同的
A
B
对象,为什么它们同时执行相同的方法很重要?因为它们正在处理单例对象的数据结构。所以同步单例对象中的数据结构…我建议您在问题中包含一小段代码,以便更好地解释您试图实现的目标。@Ixx您的问题不太清楚(如最后一行所述)例如,如果方法在Base中是私有的,那么A和B就不能执行它。嗯,好吧,但是我的子类是一个Base,所以如果Base执行私有方法,就好像子类在执行它一样。我不能在子类中调用它们,但它们是在子类的上下文中执行的。如果我有很多类从一个类继承了A,那么h私有方法这些私有方法可能同时执行。问题是,我首先调用一个Web服务,然后在响应中更新数据结构。如果服务已经被调用,我不想再调用它。我想同步代码中检查服务是否已经被调用的部分n调用,并设置已调用的变量。如果不需要,我希望避免多次调用Web服务。同步数据结构对此没有帮助。在这种情况下,您可以执行以下操作:if(responseFromServer==null){try{servicelock.lock();//do operation}cathc(){}最终{servicelock.unlock();}否则返回responseFromServer@lxx-您应该封装对web服务的调用和锁定机制,以避免将并行调用封装到新类中。因此,解决方案是在基类中有一个静态锁对象并在此基础上进行同步。如果您只需要检查服务是否正在运行,请创建一个易失性布尔变量,例如isRunning.然后您可以检查isRunning是否为true,然后不执行任何其他操作设置变量tpo true并运行服务这正是我想做的,但我想在!isRunning()之间同步代码块和isRunning=true,因为我必须在这两者之间执行一些其他代码:/并且我希望确保只有1个线程同时进入。在这种情况下,是的,您必须对静态对象使用锁。比如方法(){syncronized(static object){//code},或不要在!isRunning和isRunning之间添加代码=true@Ixx不,不是。请参阅我对您的问题的其他注释。在我的示例中,Base的状态完全由实例变量
counter
定义,因此使用
synchronized
关键字(锁定在实例级别)是可以的。如果您有一个静态变量您需要以并发方式访问,然后需要在静态级别锁定。这实际上取决于您尝试实现的内容和实现的细节。嗯,他们检查的变量实际上是singleton的一个字段…我想我必须查看此代码…但是,在讨论之后,此字段应该是h就像一个静态变量一样处理。实际上,你是对的,发布代码很有帮助,我不得不添加很多不必要的解释。