java多執行緒全域性變數共享問題

2021-08-21 12:18:04 字數 1015 閱讀 9370

先看下面問題:多個執行緒訪問全域性變數x,然後將x與i累加,啟動10個執行緒,想讓每個執行緒的輸出結果都是一樣的55,但是實際不是的。

package threadtest;

public class counter

system.out.println(thread.currentthread().getname()+"--"+x); }

public static void main(string args)

};// 啟動10個執行緒

for(int i=0;i<10;i++)

}}

實際輸出是無規則的。

解決方案一:

package threadtest;

public class counter

}; // 計數方法

public void count()

system.out.println(thread.currentthread().getname()+"--"+th.get()); }

}

用threadlocal,輸出結果是55,ok!

由此可以證明,threadlocal為每乙個執行緒儲存每乙個變數,而且每個執行緒拿到的都是自己的那乙份。

解決方案二:

將全域性變數區域性化

public class count   

system.out.println(thread.currentthread().getname() + "-" + x);

} }

每個執行緒都有乙份自己的區域性變數,因此不會產生執行緒問題。

解決方案三:物件區域性化

public static void main(string args)   

};

for(int i = 0; i < 10; i++)

}

每個物件都會有乙個自己的全域性變數。不會產生執行緒問題。

多執行緒 共享全域性變數問題

多執行緒 共享全域性變數問題 多執行緒開發可能遇到的問題 假設兩個執行緒t1和t2都要對全域性變數g num 預設是0 進行加1運算,t1和t2都各對g num加10次,g num的最終的結果應該為20。但是由於是多執行緒同時操作,有可能出現下面情況 在g num 0時,t1取得g num 0。此時...

多執行緒 共享全域性變數問題

多執行緒開發可能遇到的問題 假設兩個執行緒t1和t2都要對全域性變數g num 預設是0 進行加1運算,t1和t2都各對g num加10次,g num的最終的結果應該為20。但是由於是多執行緒同時操作,有可能出現下面情況 在g num 0時,t1取得g num 0。此時系統把t1排程為 sleepi...

多執行緒共享變數 多執行緒共享全域性變數

1.多執行緒的執行順序是無序的 像2個人賽跑,乙個先跑乙個後跑,但根據每個人跑的速度不一樣,跑一半,二者可能跑在一起去了。2.又因為多執行緒是共享乙個全域性變數的,就導致資料容易被弄髒 假如老闆讓兩個員工寫兩個主題ppt,若這兩個人沒商量好,都做了同乙個主題的ppt,導致不但速度很慢,且這個ppt有...