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
,因此我不确定
谢谢
答案 0 :(得分:9)
是的,kill
是线程之间共享的变量,必须是volatile
。但是,请考虑使用Java的本机中断机制(包括Thread.interrupt()
和Thread.interrupted()
)来实现您的需求。然后你不需要保留自己的变量。
答案 1 :(得分:0)
是。如果您未将kill
声明为volatile
,则其他线程可能会在另一个线程进行新分配后继续读取旧值。当值或更新值未定义时,在这种意义上,行为是不可预测的(实际上,新的赋值最终变得可见)。
但是,因为原始布尔值的赋值是原子的,所以该值将始终是“正确/有效”值(即true
或false
,并且永远不会是无效值。所以从这个意义上讲,行为并不是完全不可预测的(你的代码不会崩溃等)。请注意,long
类型或非基本对象不是这种情况。 Primitive int类型也具有与原始boolean相同的属性,这在标准库的String类实现中用于优化哈希代码计算。