Evin7 2012-07-30 00:13
浏览 654
已采纳

一个多线程共享变量的问题,请教下大家

工作中遇到了这么一个问题,想请教下大家。伪码如下:

[code="java"]
public class AAAAA{

public boolean enable = true; // [b]非violate[/b]

// 线程A执行
public void methodA{
    while(enable){
        .........
    }
    system.out.println("----------------------");
}

// 线程B执行
public void methodB{
    enable = false;
}

}
[/code]

前提:线程A和线程B一定都会执行code。
问题:线程A是否有可能会永远退不出循环?如果存在这种可能,请详细说明下原因,谢谢。

本人认为不会存在这种情况,但是有同事说存在这种可能,原因是JVM指令重排序优化。我查了些资料,没有找到充足的证据来证明此事,所以想在这里请教下各位大侠,先行谢过了。 :)

  • 写回答

15条回答 默认 最新

  • 被掐死的温柔 2012-07-30 12:18
    关注

    看看effective java 中文版第二版 230页 如果没错的话 这个描述叫做火星失败 liveness failure 是因为 while(enable) 被jvm 优化成 if(!enable) {
    while (true)
    } 所以需要设置同步访问 或者是 在enable 前 加上 violate 这样 当enable变化时 这样他能保证任何一个线程在读取该域的时候能看见最新被修改的值

    以上全是引用书中的话 若有不全的地方 请看书籍

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(14条)

报告相同问题?

悬赏问题

  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码