次の状況に遭遇しました。
public class Foo {
private boolean valid;
...
}
public class ConcurrentFoo extends Foo {
...
}
スレッドセーフConcurrentFoo
ではない Foo とは対照的に、マルチスレッド環境で使用されるサブクラスであるため、代わりに、サブクラスのみになりたいと思います。boolean valid
volatile 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;
}
とにかく、サブクラスで(まあ、除いて)などの非アクセス修飾子を変更できるかどうか知りたいと思っていました。volatile
final
それが不可能な場合、また可能ではない可能性があると思いますが、そのシャドーイングの代替案が考慮されない限り、この状況を克服する最も簡単な方法は何でしょうか?
サブクラスで同期?
さらにコンテキストが必要な場合は、教えてください。
この場合、パフォーマンスがある程度関連していることに注意してください。