我有从 Base 继承的 A 类和 B 类。
Base 有一个私有方法。A 和 B 可能同时执行此方法。
所以我想同步那个方法。如果我只是在签名中添加“同步”关键字,那会使 A 和 B 的执行同步(共享同一个锁)吗?还是我需要生成一个静态锁对象...?
抱歉,有点糊涂……
我有从 Base 继承的 A 类和 B 类。
Base 有一个私有方法。A 和 B 可能同时执行此方法。
所以我想同步那个方法。如果我只是在签名中添加“同步”关键字,那会使 A 和 B 的执行同步(共享同一个锁)吗?还是我需要生成一个静态锁对象...?
抱歉,有点糊涂……
如果您的代码看起来有点像下面的示例,那么它不是线程安全的,您需要包含某种形式的同步以确保对私有方法的调用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();
}
}
Base 有一个私有方法。A 和 B 可能同时执行此方法。
派生类不继承私有方法或字段,因此您的问题的答案是否定的。
编辑根据评论:
如果您有两个对象 A 和 B,并且他们正试图操作 Singleton 对象 C,那么在这种情况下,应该有同步的是 C,而不是 A 和 B。
多线程应用程序遵循的一般规则是,每个需要防止并发访问以保持稳定状态的类都有责任正确使用同步,您不应该也不能期望方法的调用者访问对象状态同步方式。
我从您的帖子中可以理解的是,您有一个带有私有方法的基类。您正在创建此基类的不同对象或从基类派生的类。
现在,如果您使私有方法同步它不会使该方法的执行同步,因为您有多个对象。实例级锁仅针对每个对象。
例如,您有 Test 类的 ObjectA 和 ObjectB,这两个对象都可以同时执行类 Test 中定义的私有方法,比如 myMethod(),即使它是同步的,因为锁定在对象上。
希望这可以帮助。
我所知道的是,私人成员不会被继承。所以A类和B类不能通过继承或者创建基类的对象来调用这个私有方法,直到基类中有一个公共方法可以访问这个私有方法。