本帖最后由 Neverbelazy 于 2013-5-15 00:39 编辑
有如下一段代码:
需求:newThread运行 判断 which(!flag) i++; 主函数设定过1秒钟,更改flag
结果, 按原始程序 newThread中 无限循环;a处代码不被运行到 System.out.println(i) 没有被打印
但是,如果b处按注释修改,则不会无限循环
------------------------------------------------------------------------------------------------
程序中看不出有什么问题,但是却有如此奇怪的结果, 请高手解答!- public class ConcurrencyTest {
- private static boolean flag;
- public static void main(String[] args) throws InterruptedException {
- Thread newThread=new Thread(new Runnable(){ //newThread线程构造
- public void run(){
- int i=0;
- while(!flag)
- { i++; } // --> b. 可是,如果此句换成{ System.out.println(i++);} // 就可以打印出结果,程序循环打印一段后停止
- System.out.println(i); // --> a. 打印看i在多少的时候 flag被改变了
- }
- });
- newThread.start();
- TimeUnit.SECONDS.sleep(1); // 挂起1秒
- flag=true; // 改变flag企图让newThread的while循环停止
- }
- }
复制代码 --------------- 由于2# xuemeng同学的误解,程序上加上了{ }, 以避免造成歧义 -------------
-------------------------------------- 不确定的答案 -------------------------------------------------------------
--------------- xuemeng同学的截图结果是正确的,那就暂时认为是JVM不同导致的吧--------------- |