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内存模型,指令重排序,网上资料不少。