在Java中使子类中的变量volatile

时间:2013-05-13 19:15:24

标签: java inheritance concurrency volatile

我遇到过以下情况:

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

public class ConcurrentFoo extends Foo {
        ...
}

由于ConcurrentFoo是要在多线程环境中使用的子类,而不是Foo(不是线程安全的),我希望boolean valid是相反,volatile boolean valid仅在子类中

使用volatile的目的是避免锁定和同步,因为它们似乎是不必要的。在对象的生命周期中,这个变量只有两次更新,并且有很多(并发)读取。

当然,我可以使用同步来解决子类中的问题,或者我可以以任何其他方式实现它,这样在使用FooConcurrentFoo时会有更明确的区别。例如:

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子类

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

如果需要更多背景,请说明 我应该注意到,在这种情况下,表现具有一定的相关性。

1 个答案:

答案 0 :(得分:2)

我怀疑不会让它变得不稳定是一个过早的优化。如果你不需要它挥发,但它是挥发性的,你浪费大约3-10纳秒。如果你打电话100次,你就会浪费一秒钟(在我怀疑的组件的整个生命周期中)。这段时间对你来说至关重要吗?