Java同步超类的私有方法

时间:2012-05-22 16:35:24

标签: java methods synchronization subclass

我有从A继承的A和B类。

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

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

抱歉,有点困惑......

4 个答案:

答案 0 :(得分:3)

如果您的代码看起来有点像下面的示例,那么它不是线程安全的,您需要包含某种形式的同步,以确保对私有方法increment的调用是原子的并确保可见性。在这个简单的例子中,使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();
    }
}

答案 1 :(得分:2)

  

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

私有方法或字段不是由派生类继承的,所以回答你的问题是否。

根据评论编辑:

如果你有两个对象A和B并且他们试图操纵Singleton对象C,那么它就是C,它应该具有同步而不是A和B.

多线程应用程序遵循的一般规则是,每个需要保护并发访问以保持稳定状态的类负责正确使用同步,你不应该并且不能期望该方法的调用者访问该对象以同步方式陈述。

答案 2 :(得分:2)

我可以从你的帖子中了解到你有一个带私有方法的基类。您正在创建此基类的不同对象或从基类派生的类。

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

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

希望这有帮助。

答案 3 :(得分:0)

我所知道的是,私人成员不是继承的。因此,类A和类B无法使用继承或创建Base类的对象来调用此方法来访问此私有方法,直到Base类中有一个公共方法可以访问此私有方法。