java一次多线程的怪异时间和偶然发现相关解释

大概情况是  程序开一个子线程,然后子线程里面有一个 flag 控制  while 循环

在子线程启动之后,等待一下。主线程改变flag 的变量。


然后在while循环中 什么都不加,程序异常,不能正确执行结果

在while循环中加入一个syso 输出语句。代码正确执行。


代码如下


public class 灵异代码 {
           public static void main(String[] args) throws InterruptedException {
        	   灵异多线程 t1 = new  灵异多线程();
			  t1.start();
			  Thread.sleep(500);
			  t1.isRun(false);
		    System.out.println("flag: " + t1.flag);
           }
}


class 灵异多线程  extends Thread {
	public   boolean flag = true;
	@Override
	public void run() {
            System.out.println("子线程开始执行...");
		 while(flag){
			 
			///这个输出语句注释和不注释影响结果//
			// System.out.println("ing");
		 }
		 System.out.println("子线程结束执行...");
	}
	//控制线程的while循环
	public void isRun(boolean flag){
		this.flag = flag;
		
	}
}


其实程序一开始是想证明多线程时,关键字 volatile 修饰flag在多线程的可见性。

而却莫名其妙的出个这一档子事


知道后来偶然看到R大的解释,大概是个硬件,解释器有关吧。反正似懂非懂

 * 参考网址
 * https://www.zhihu.com/question/39458585
 * http://hllvm.group.iteye.com/group/topic/34932#post-232535



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值