我遇到过以下情况:
public class Foo {
private boolean valid;
...
}
public class ConcurrentFoo extends Foo {
...
}
由于ConcurrentFoo
是要在多线程环境中使用的子类,而不是Foo(不是线程安全的),我希望boolean valid
是相反,volatile boolean valid
,仅在子类中。
使用volatile
的目的是避免锁定和同步,因为它们似乎是不必要的。在对象的生命周期中,这个变量只有两次更新,并且有很多(并发)读取。
当然,我可以使用同步来解决子类中的问题,或者我可以以任何其他方式实现它,这样在使用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
除外), in子类。
如果不可能,我认为可能不会,除非考虑阴影替代方案,克服这种情况最简单的方法是什么?
子类中的同步?
如果需要更多背景,请说明 我应该注意到,在这种情况下,表现具有一定的相关性。
答案 0 :(得分:2)
我怀疑不会让它变得不稳定是一个过早的优化。如果你不需要它挥发,但它是挥发性的,你浪费大约3-10纳秒。如果你打电话100次,你就会浪费一秒钟(在我怀疑的组件的整个生命周期中)。这段时间对你来说至关重要吗?