關於java執行緒安全問題
阿新 • • 發佈:2018-12-30
執行緒:負責一個程序中的程式碼執行。執行緒是程序中的一個執行路徑。
執行緒安全問題出現的根本原因:
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;
}
}
}
}
}
執行緒安全問題出現的根本原因:
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;
}
}
}
}
}