我遇到过以下情况:
public class Foo {
private boolean valid;
...
}
public class ConcurrentFoo extends Foo {
...
}
由于是要在多线程环境中使用的子类,而不是 Foo ,ConcurrentFoo
它不是线程安全的,因此我希望仅在子类中使用。boolean valid
volatile boolean valid
using 的目标volatile
是避免锁定和同步,因为它们似乎是不必要的。在对象的生命周期中,这个变量只会有两次更新,并且会有很多(并发)读取。
Foo
当然,我可以只使用同步来解决子类中的问题,或者我可以用其他方式实现它,这样在使用and时会有更清晰的区别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
)。
如果不可能,而且我认为可能不可能,除非考虑到这种替代方案,否则克服这种情况的最简单方法是什么?
子类中的同步?
一定要告诉,如果需要更多的上下文。
我应该指出,在这种情况下,性能具有一定的相关性。