count方法計(jì)算0-10的總和驻债,并輸出當(dāng)前線程名,期望每個(gè)線程都打印出55.
public class MultiThreadDemo_01 {
public static void main(String[] args){
Runnable runnable = new Runnable(){
Count count = new Count();
@Override
public void run() {
count.count();
}
};
for(int i=0;i<5;i++){
new Thread(runnable).start();
}
}
}
class Count{
int num=0;//全局變量
public void count(){
for(int i=0;i<=10;i++){
num+=i;
}
System.out.println(Thread.currentThread().getName()+"==="+num);
}
}
結(jié)果:只有一個(gè)線程輸出55.為保證所有線程都打印出55
Thread-0===55
Thread-2===110
Thread-4===165
Thread-1===220
Thread-3===275
解決方案1:
全局變量num放在count方法內(nèi)部
class Count{
public void count(){
int num=0;//count方法的局部變量
for(int i=0;i<=10;i++){
num+=i;
}
System.out.println(Thread.currentThread().getName()+"==="+num);
}
}
解決方案2:
Count count = new Count();放在run方法中柄慰,這時(shí)count引用是線程內(nèi)的局部變量
結(jié)果:所有線程都輸出55.
Thread-0===55
Thread-3===55
Thread-4===55
Thread-1===55
Thread-2===55
解決方案3:每次啟動一個(gè)線程使用不同的線程類嫉到,不推薦。
總結(jié):存在成員變量的類用于多線程時(shí)是不安全的瞎颗,不安全體現(xiàn)在這個(gè)成員變量可能發(fā)生非原子性的操作件甥,而變量定義在方法內(nèi)也就是局部變量是線程安全的,日常開發(fā)中哼拔,通常需要考慮成員變量或者說全局變量在多線程環(huán)境下引有,是否會引發(fā)一些問題。
線程安全與共享資源
允許被多個(gè)線程同時(shí)執(zhí)行的代碼稱作線程安全的代碼倦逐。線程安全的代碼不包含競態(tài)條件譬正。當(dāng)多個(gè)線程同時(shí)更新共享資源時(shí)會引發(fā)競態(tài)條件。因此檬姥,了解Java線程執(zhí)行時(shí)共享了什么資源很重要