3

次の状況に遭遇しました。

public class Foo {
    private boolean valid;
        ...
}

public class ConcurrentFoo extends Foo {
        ...
}

スレッドセーフConcurrentFooではない Foo とは対照的に、マルチスレッド環境で使用されるサブクラスであるため、代わりに、サブクラスのみになりたい思います。boolean validvolatile boolean valid

を使用する目的volatileは、ロックと同期を回避することです。これらは不要に見えるためです。オブジェクトの有効期間中にこの変数への更新は 2 回だけで、多数の (同時) 読み取りがあります。

Fooもちろん、同期を使用してサブクラスの問題を解決することも、他の方法で実装することもできますConcurrentFoo。例えば:

public class ConcurrentFoo extends Foo {
    // Is this considered shadowing, when adding volatile?
    private volatile boolean valid;
    // Or I could get a completely fresh name.
    private volatile boolean concurrentValid;
}

とにかく、サブクラスで(まあ、除いて)などの非アクセス修飾子を変更できるかどうか知りたいと思っていました。volatilefinal

それが不可能な場合、また可能ではない可能性があると思いますが、そのシャドーイングの代替案が考慮されない限り、この状況を克服する最も簡単な方法は何でしょうか?
サブクラスで同期?

さらにコンテキストが必要な場合は、教えてください。
この場合、パフォーマンスがある程度関連していることに注意してください。

4

1 に答える 1

2

揮発性にしないのは時期尚早の最適化だと思います。揮発性にする必要はないが、揮発性にする場合は、約 3 ~ 10 ナノ秒を無駄にしています。これを 100 回呼び出すと、1 マイクロ秒を無駄にします (私が疑うコンポーネントの寿命にわたって)。この時間はあなたにとって重要ですか?

于 2013-05-13T19:19:48.533 に答える