1. 程式人生 > >關於java執行緒安全問題

關於java執行緒安全問題

執行緒:負責一個程序中的程式碼執行。執行緒是程序中的一個執行路徑。


執行緒安全問題出現的根本原因:
1. 存在著兩個或者兩個以上的執行緒。
2. 多個執行緒共享了著一個資源, 而且操作資源的程式碼有多句。




執行緒安全問題的解決方案:

1. 使用同步程式碼塊

格式:
synchronized(鎖物件){
需要被同步的程式碼;
}

執行緒的生命週期狀態圖(執行緒總共有圖中的這幾種狀態)
  sleep\wait()
   <----------臨時阻塞<-------------  
呼叫了start方法 搶奪了cpu的執行權                                  執行完任務
建立 ---------------------> 可執行 ----------------------------->執行  -------------->消亡
 <---------------------------
被搶奪了cpu的執行權


同步程式碼塊要注意的細節:
1. 鎖物件可以是任意的物件、.
2. 鎖物件必須是多個執行緒共享的物件(鎖物件必須是唯一)。
3. 執行緒呼叫了sleep方法是不會釋放鎖物件的。
4. 只有會出現執行緒安全問題的時候才使用java的同步機制(同步程式碼塊和同步 函式),


 死鎖現象出現 的根本原因:
 1. 存在兩個或者兩個以上的執行緒存在。
 2. 多個執行緒必須共享兩個或者兩個以上的資源。


class SaleTickets extends Thread{
static int num = 50;  //非靜態成員變數。 非靜態成員變數在每個物件中都維護了一份資料。 

public SaleTickets(String name){
super(name); //呼叫父類一個引數的建構函式, 初始化執行緒的名字。
}
//執行緒的任務程式碼...
@Override
public void run() {
while(true){
synchronized ("鎖") {
if(num>0){
try {
Thread.sleep(100);
System.out.println(Thread.currentThread().getName()+"賣出了"+num+"號票");
num--;
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
System.out.println("售罄了...");
break;
}
}


}

}
}