这应该是不稳定的还是不可预测的结果?

时间:2012-07-31 08:08:28

标签: java multithreading concurrency volatile

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();,我应该预期线程停止或结果不可预测,因为没有声明{{ 1}}为kill?由于我通过volatile方法更新kill,因此我不确定 谢谢

2 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:0)

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

但是,因为原始布尔值的赋值是原子的,所以该值将始终是“正确/有效”值(即truefalse,并且永远不会是无效值。所以从这个意义上讲,行为并不是完全不可预测的(你的代码不会崩溃等)。请注意,long类型或非基本对象不是这种情况。 Primitive int类型也具有与原始boolean相同的属性,这在标准库的String类实现中用于优化哈希代码计算。