java一次多线程的怪异时间和偶然发现相关解释
2018-03-01 14:54
309 查看
大概情况是 程序开一个子线程,然后子线程里面有一个 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
在子线程启动之后,等待一下。主线程改变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
相关文章推荐
- 多线程实例——每一秒显示一次系统时间(Java)
- java中跟时间相关的类
- Java 多线程设置线程超时时间之 Callable接口和Future接口 线程超时控制
- JAVA处理日期(Date)时间(Time)以及相关类的介绍
- Java Notes: Java的多线程创建的两种方法以及Race Condition的解释
- java多线程相关知识
- Java 时间相关备忘
- Java多线程复习与巩固(二)--线程相关工具类Timer和ThreadLocal的使用
- java学习--多线程相关知识
- Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(1) Calendar - 跨到对岸去
- java 时间相关的类互相转换
- JAVA菜鸟入门篇 - 时间处理相关类实例:打印该月日期表 (29)
- Java Notes: Java的多线程创建的两种方法以及Race Condition的解释
- JAVA处理日期(Date)时间(Time)以及相关类的介绍
- Java多线程下统计多个线程的运行时间
- Java Web开发相关名词解释
- java多线程Future和Callable类的解释与使用
- JAVA:用多线程实现时间的动态显示
- Java中Date及Timestamp时间相关内容
- Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(2) 自己封装的Calendar接口