我有从A继承的A和B类。
Base有一个私有方法。 A和B可能同时执行此方法。
所以我想同步那个方法。如果我只是在签名中放入“synchronize”关键字,是否会使A和B执行同步(共享同一个锁)?或者我是否需要生成静态锁定对象......?
抱歉,有点困惑......
答案 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类中有一个公共方法可以访问此私有方法。