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 完整和可执行文件我们可以运行以查看您看到的行为。