• while循环中使用输出语句停止死循环的原因


    while循环中使用输出语句停止死循环的原因

    直接看代码

    public class WhileTest {
        private boolean flag = true;
        public void setFlag(boolean flag) {
            this.flag = flag;
        }
        public void say() {
            while(flag) {
            }
            System.out.println("--------------线程停止------------------------------------");
        }
        public static void main(String[] args) throws InterruptedException {
            final WhileTest wt = new WhileTest();
            Thread t = new Thread(new Runnable() {
                
                @Override
                public void run() {
                    wt.say();
                }
            });
            t.start();
            Thread.currentThread().sleep(500);
            wt.setFlag(false);
        }
    }
    1.  

     

    public void say() {
            while(flag) {
                System.out.println("");
            }
            System.out.println("--------------线程停止------------------------------------");
        }
     public void println(String x) {
            synchronized (this) {
                print(x);
                newLine();
            }
        }

    很明显,会出现死循环,因为主线程修改共享变量的值,另一个线程并且读取到修改

    常见的解决方案是
     flag  加上volatile关键字,强制刷新共享变量的值和主内存的值一致。

    但是,如果在while循环体中加上一段输出语句,也能够停止线程,原因在哪里,看下源码

    1.  果while循环内,加上Thread.sleep语句,给CPU一段时间,cpu会去同步主内存和工作内存的共享变量的值,也能够停止死循环,不过不推荐这样实现,存在不确定性。
  • 相关阅读:
    CSS边框(圆角、阴影、背景图片)
    CSS3浏览器兼容
    HTML5全局属性
    HTLM5新增属性
    HTML5标签
    如何开始使用bootstrap
    重新了解Java基础(三)-运行机制&HelloWorld
    重新了解Java基础(二)-Java的特性
    Java关键字之native
    重新了解Java基础(一)
  • 原文地址:https://www.cnblogs.com/adong7639/p/14028482.html
Copyright © 2020-2023  润新知