1

控制线程执行的变量 是volatile必需的吗?kill

public class MyThread extends Thread{  

  private boolean kill = false;  

  public void killThread(){  
      kill = true;  
  }  

  @Override  
  public void run(){  
     while(!kill){  
                 //do stuff  
     }  
  }  

}  

例如,如果在代码的其他部分(另一个线程)中,我theThreadRef.killThread();应该期望线程停止还是由于没有声明为而导致结果不可预测?我不确定这一点,因为我通过该方法更新了。 谢谢 killvolatilekillkillThread

4

2 回答 2

9

是的,kill是线程之间共享的变量,必须是volatile. 但是,请考虑使用 Java 的原生中断机制,包括Thread.interrupt()andThread.interrupted()来实现您所需要的。然后你就不需要保留你自己的变量了。

于 2012-07-31T08:09:57.803 回答
0

是的。如果您不声明killas volatile,则其他线程可能会在其他线程进行新分配后继续读取旧值。值何时或是否更新是未定义的,因此从这个意义上说,行为是不可预测的(实际上,新的赋值最终变得可见)。

然而,因为原始布尔值的分配是原子的,所以该值将始终是“正确/有效”值(即,要么是无效值,true要么false永远不会是无效值)。所以从这个意义上说,行为并不是完全不可预测的(你的代码不会崩溃等)。long请注意,类型或非原始对象并非如此。原始 int 类型也具有与原始 boolean 相同的属性,这在标准库的 String 类实现中用于优化哈希码计算。

于 2012-07-31T08:28:45.050 回答