在java多线程中用while循环和for循环输出的结果不同

public class Demo14 {

public static void main(String[] args) throws InterruptedException {

    MyThread2 thread2 = new MyThread2();
    Thread t = new Thread(thread2,"1");
    Thread t1 = new Thread(thread2,"2");
    t1.start();
    t.start();


}

}
class MyThread2 implements Runnable{
private int a = 5;
@Override
public void run() {
while(a>0){
a--;
System.out.println(Thread.currentThread

().getName()+":"+a);
}
}}

输出结果:
Thread-1:3
Thread-0:3
Thread-1:2
Thread-1:0
Thread-0:1

public class Demo14 {

public static void main(String[] args) throws InterruptedException {
    MyThread2 thread2 = new MyThread2();
    Thread t = new Thread(thread2);
    Thread t1 = new Thread(thread2);
    t1.start(); 
    t.start();
}

}

class MyThread2 implements Runnable{
private int a = 5;
@Override
public void run() {

    // TODO Auto-generated method stub
    for(int i = 0; i < a ; i++){
        System.out.println(Thread.currentThread

().getName()+":"+i);
}
}}

输出结果:
Thread-0:0
Thread-1:0
Thread-0:1
Thread-1:1
Thread-0:2
Thread-1:2
Thread-0:3
Thread-1:3
Thread-0:4
Thread-1:4


你的命题是错误的:两个Demo之所以不同,因为第一个Demo打印的是同一个MyThread2对象的字段a,第二个Demo打印的是同一个MyThread2对象里的方法里的局部变量i.
第一个Demo,两个线程在字段a上存在“内存冲突”——一个线程在字段a上的操作(a--),会影响另一个线程对该字段的读取。
第二个Demo,两个线程在局部变量 i 上不存在冲突,原因是,一个方法的局部变量的生命周期始于方法的调用,终于方法调用结束。当两个线程调用这个run方法时,这个方法里的局部变量 i 在该方法的每次调用时都被创建出来,并且在方法的调用与调用之间的局部变量互相独立,互不相关。

因为你的两个线程同时访问的是同一个Thread2对象的同一个变量a,但是没有作同步处理,所以两个线程的运行结果有重复。
本质上跟while和for没有关系,并发环境下没有同步的访问,变量的值本身就存在不确定性。
结论就是:不是for或者while的原因。

另外,while中你打印的是a,同时a也在类减少。for你则定义临时变量i<a,a是不变的,循环打印临时变量i。
所以两个线程运行时for循环都打印了一遍i从0-4.
本质上for和while是没有区别的。

没有进行同步处理就是这样 可以考虑加个同步代码块。就能按顺序输出了。
跟wihle 和for循环没什么关系 。 这样的写法你开两次for循环结果都会是不一样的。 跟线程执行速度有快有慢

没有做同步得出的结果就是随机的,线程执行有快有慢,不是for和while的原因

不是while和for 的问题
是多线程本来就是改变了程序的运行顺序,导致结果具有一定的不确定性。

好像明白了,我去改下代码,谢谢各位。