假设我有一个像这样运行的线程:
private boolean working = true;
@Override public void run() {
working = true;
// do something
working = false;
....
}
在我的主线程中,我不断地展示正在使用的状态
while(threadClassObject.isWorking()) {
System.out.println(threadClassObject.isWorking());
}
这行得通吗?我试过这个例子,它似乎有效。但是有没有办法让它崩溃呢?什么例如如果线程正在改变工作状态,而同时主线程试图读取它,会发生这种情况吗?
最佳答案
你的问题的答案是它可能有效,但上面的代码是一个有风险的代码,随时可能崩溃。尝试使 working
volatile
像
private volatile boolean working = true;
例如什么如果线程正在改变工作状态,而同时 mainThread 试图读取它,会发生这种情况吗?
赋值操作是一个原子操作。所以如果你有一个 cpu,两个线程在访问变量时永远不会发生冲突。如果您有多个 CPU,则两个线程在访问变量时可能会发生冲突。对于这两种情况,volatile
将确保该值对其他线程可见。
注意:volatile
适合您的情况,但如果您有更复杂的数据要跨线程共享 try looking into this
编辑:
添加评论也是解决方案的一部分。让它更清楚。
基本上是在 cpu 级别进行优化,值更改后我的一个线程可能对另一个线程不可见。一个很好的例子是 cpu 缓存 bcoz 优化值永远不会反射(reflect)在其他线程可能正在读取的 ram 中。 Volatile 告诉这个变量的值可以在当前线程的范围之外改变,所以没有进行这样的优化......
关于java - 从外部获取线程变量的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9551630/