是线程安全呼叫外级变量


public class Status {
    private Scheduler scheduler;
    private volatile Boolean lastResult;
    public Status() {
        scheduler = new Scheduler();
        scheduler.everyTenSeconds(new Action());
    }

    public boolean isSth()  {
        if (lastResult != null && lastResult) {
            return lastResult;
        } else {
            return checkSth();
        }
    }

    private boolean checkSth() throws SomeException {
        // checking sth
    }
    private class Action implements Runnable {
        @Override
        public void run() {
            try {
                lastResult = checkSth();
            } catch (SomeException e) {
                lastResult = false;
            }
        }
    }
}

调用外类变量是否安全吗?最后的结果是lastresult,但在调用ISSTH()时,Lastresult始终是无效的。尽管运行被称为两次。

线程安全调用外班级变量吗?

通常,它既不是线程安全也不是线程安全。线程安全取决于您实际做的事情。

和...要严格正确...您不能 call 变量:

  • 您可以读取变量的值
  • 如果变量的值是对象,则可以调用该对象的实例方法。

在您的示例中,代码正在执行涉及挥发性的操作序列。在挥发性上的单个读取或写入操作是原子的,并且针对Java内存模型具有明确定义的属性。但是,一系列操作不是原子,JMM的性质很复杂。

为了简短的短篇小说,您的代码正在执行lastResult上的读写序列,而不是线程安全。


但是,尽管如此,我看不到您的代码如何始终看到lastResult设置为null。我怀疑这与您使用此代码的方式有关。我们真的需要一个MCVE;即A 完整可执行文件我们可以运行以查看您看到的行为。

相关内容

  • 没有找到相关文章

最新更新