当前位置: 代码迷 >> J2EE >> 帮忙看下这个代码多谢
  详细解决方案

帮忙看下这个代码多谢

热度:64   发布时间:2016-04-17 23:20:03.0
帮忙看下这个代码谢谢~
package com.djzhu.main;

public class Main {


public static int num = 0;

public static void main(String [] args){
Thread thread = new Thread(){
public void run() {
int i = 10000;
while(i-- > 0){
num++;
}
};
};
Thread thread2 = new Thread(){
public void run() {
int i = 10000;
while(i-- > 0){
num--;
}
}
};
thread.start();
thread2.start();
try {
Thread.sleep(1000); //等待线程执行
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Final: " + num);
}
}


我以为以上这段代码是线程未同步的,因为num++和num--不是原子操作,那么线程执行完成之后应该不会恰好输出0。但是结果却总是0。这是什么问题?因为试了很多次了,每次都是0.所以应该可以排除偶然因素。
------解决思路----------------------
这么写:


public class Main {
 
 
    public static volatile int num = 0;
     
    public static void main(String [] args){
        Thread thread = new Thread(){
            @Override
            public void run() {
                int i = 10000;
                while(i-- > 0){
                    num++;
                }
            };
        };
        Thread thread2 = new Thread(){
            @Override
            public void run() {
                int i = 10000;
                while(i-- > 0){
                    num--;
                }
            }
        };
        thread.start();
        thread2.start();
        try {
            Thread.sleep(1000);    //等待线程执行
        } catch (InterruptedException e) {
        }
        System.out.println("Final: " + num);
    }
}


因为你的程序中两个线程各自操作缓存中的变量,最后才刷回主存,所以永远是0.
可以了解下java内存模型,指令重排序,网上资料不少。
  相关解决方案