1. 程式人生 > >用買票例子講講多執行緒安全問題

用買票例子講講多執行緒安全問題

在javase中多執行緒安全問題,買票的例子幾乎是都會講到,今天就以買票的程式來簡單分析下java多執行緒安全問題的產生以及解決方案

先看程式程式碼:

public class ThreadTest1 {
/**
* @param args
*/
public static void main(String[] args) {
//這是二個執行緒操作同一個物件 一般都是實現Runnable介面
ThreadDemo t = new ThreadDemo();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);

t1.start();
t2.start();
t3.start();
t4.start();

}


}
class ThreadDemo implements  Runnable {
String str = "";
int num=100;
public void run() {
while(true){
if(num>0){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"-----"+"num="+num--);
}
}
}
}

列印結果如圖:


通過列印的結果發現出現了0 -1 -2,這肯定不是我們想要的結果,現在就分析問題出現的原因


通過例子分析發現多執行緒安全產生的原因有

1:多執行緒操作共享的資料(票數),因為四個執行緒都是操作一個物件,而物件分配在堆記憶體中,操作的就是它的成員變數是

2:操作共享資料的執行緒有多條,在例子中體現就是if()語句 和輸出語句

總結:當一個執行緒在執行操作共享的多條程式碼過程中,其他執行緒參與了運算,就會導致安全問題的產生!