3

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

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

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

抱歉,有点糊涂……

4

4 回答 4

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();
    }
}
于 2012-05-22T16:43:50.803 回答
2

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

派生类不继承私有方法或字段,因此您的问题的答案是否定的。

编辑根据评论:

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

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

于 2012-05-22T16:37:23.590 回答
2

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

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

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

希望这可以帮助。

于 2012-05-22T16:49:55.590 回答
0

我所知道的是,私人成员不会被继承。所以A类和B类不能通过继承或者创建基类的对象来调用这个私有方法,直到基类中有一个公共方法可以访问这个私有方法。

于 2012-05-22T17:13:11.707 回答