3

我遇到过以下情况:

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

public class ConcurrentFoo extends Foo {
        ...
}

由于是要在多线程环境中使用的子类,而不是 Foo ,ConcurrentFoo它不是线程安全的,因此我希望仅在子类中使用boolean validvolatile 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)。

如果不可能,而且我认为可能不可能,除非考虑到这种替代方案,否则克服这种情况的最简单方法是什么?
子类中的同步?

一定要告诉,如果需要更多的上下文。
我应该指出,在这种情况下,性能具有一定的相关性。

4

1 回答 1

2

我怀疑不让它变得不稳定是一种过早的优化。如果您不需要它是易失的,但它是易变的,那么您浪费了大约 3-10 纳秒。如果你调用它 100 次,你就是在浪费一微秒(在我怀疑的组件的生命周期内)。这段时间对你来说很重要吗?

于 2013-05-13T19:19:48.533 回答