java - 从外部获取线程变量的值

标签 java multithreading

假设我有一个像这样运行的线程:

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/

相关文章:

c# - 确定线程的来源

java - Java 中的分割字符串数组 (Android)

java - table.getSelectedRow() 不起作用

java - 双重检查锁定 - 它在 Java 中到底有效吗?

java - Google Gmail API - 无法加载用户电子邮件签名

c++ - 如何过早停止长时间运行的功能?

java - 如何设置对象的 boolean 状态

php - apache php > 用户请求

java - 忽略从另一个线程抛出的 InterruptedException

c++ - 如何在 C++ 中测试条件变量?