zoukankan      html  css  js  c++  java
  • 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会去同步主内存和工作内存的共享变量的值,也能够停止死循环,不过不推荐这样实现,存在不确定性。
  • 相关阅读:
    android系统属性获取及设置
    Android Strings.xml To CSV / Excel互转
    android adb命令 抓取系统各种 log
    Android开源日志库Logger的使用
    解决git仓库从http转为ssh所要处理的问题
    PHP中var_dump
    oracle文字与格式字符串不匹配的解决
    Apache服务器和tomcat服务器有什么区别?
    【手把手教你Maven】构建过程
    Spring MVC页面重定向
  • 原文地址:https://www.cnblogs.com/adong7639/p/14028482.html
Copyright © 2011-2022 走看看