2.3.2解决同步死循环

/**
 * @author wuyoushan
 * @date 2017/5/3.
 */
public class PrintString implements Runnable{
    private boolean isContinuePrint=true;

    public boolean isContinuePrint() {
        return isContinuePrint;
    }

    public void setContinuePrint(boolean continuePrint) {
        isContinuePrint = continuePrint;
    }

    public void printStringMethod(){
        try {
            while (isContinuePrint == true) {
                System.out.println("run printStringMethod threadName=" +
                        Thread.currentThread().getName());
                Thread.sleep(1000);
            }
        }catch(InterruptedException e){
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        printStringMethod();
    }
}

/**
 * @author wuyoushan
 * @date 2017/3/20.
 */
public class Run {
    public static void main(String[] args){
        PrintString printStringService=new PrintString();
        new Thread(printStringService).start();
        System.out.println("我要停止它!stopThread="+Thread.currentThread().getName());
        printStringService.setContinuePrint(false);
    }
}

程序的运行结果为:

我要停止它!stopThread=main
run printStringMethod threadName=Thread-0

但当上面的示例代码的格式运行在-server服务器模式中64bit的JVM上时,会出现死循环。解决的办法是使用volatile关键字

关键字volatile的作用是强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值。

摘选自 java多线程核心编程技术-2.3.2

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,366评论 11 349
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 3,731评论 0 11
  • Java SE 基础: 封装、继承、多态 封装: 概念:就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽...
    Jayden_Cao阅读 2,140评论 0 8
  • 2016,我唯一觉得歉疚的是,欠爸爸一个美好的旅行。 和他一起开着车回去,给妈妈过生日。虽然跟他之间发生了一连串的...
    真水无香zswx阅读 437评论 2 8
  • 面试通过,已在广州半个多月,便试着联系一下那位让我魂牵梦绕的姑娘,姑娘并不知道我来到广州,于是问道: “你是在广州...
    小马哥S阅读 128评论 0 0