各位大神,本人java小菜鳥。學習java遇到一點問題,下面的代碼中,已經使用了join方法,為什麼顯示的結果不是1000呢?請前輩指教!
public class JoinThread extends Thread {
public static volatile int n=0;
public void run(){
for(int i=0;i<10;i++,n++){
try{
sleep(2);
}catch(Exception e){}
}
}
public static void main(String args[])throws Exception{
Thread[] threads=new Thread[100];
for(int i=0;i<threads.length;i++)
threads[i]=new JoinThread();
for(int i=0;i<threads.length;i++)
threads[i].start();
for(int i=0;i<threads.length;i++)
threads[i].join();
System.out.println("n="+JoinThread.n);
}
}
for(int i=0;i<threads.length;i++)
threads[i].start(); //這裡所有線程都啟動了,run方法也沒有加鎖。會有同時多個線程同時訪問n,引起髒數據。
for(int i=0;i<threads.length;i++)
threads[i].join(); //這裡join只是起到等上面線程執行完了在打印n,但上面n值已經不對了,再等也沒用。
System.out.println("n="+JoinThread.n);
解決方法, 增加synchronized
public synchronized void run(){
當然,也可以把鎖粒度減小。