多執行緒程式中的各個執行緒都是自由執行的,所以它們有時就會同時操作同乙個例項。這在某些情況下會引發問題。例如,從銀行賬戶取款時,餘額確認部分的**應該是像下面這樣的。
if (可用餘額大於取款金額)
private void init() catch (interruptedexception e)
outpurer.output("yucaixiang");}}
}).start();
new thread(new runnable() catch (interruptedexception e)
outpurer.output("linshanshan");}}
}).start();
} static class outpurer
system.out.println();
}}
}}此**會不斷輸出兩個名字,如果不用synchronized關鍵字,輸出的兩個名字會可能出現錯誤。
synchronized關鍵字也可以放到方法上,鎖住的時例項化的物件,如果時靜態方法,則需要類鎖。
public synchronized void output2(string name)
system.out.println();
}
類鎖
由上述同步靜態方法引申出乙個概念,那就是類鎖。其實系統中並不存在什麼類鎖。當乙個同步靜態方法被呼叫時,系統獲取其實就是代表該類的類物件的物件鎖,在程式中獲取類鎖可以嘗試用以下方式獲取類鎖。類鎖也可以理解為鎖住的是位元組碼物件。
synchronized (***.class)
synchronized (class.forname("***"))
示例**:
public class traditionthread
private void init() catch (interruptedexception e)
outpurer.output("yucaixiang");}}
}).start();
new thread(new runnable() catch (interruptedexception e)
outpurer.output2("linshanshan");}}
}).start();
} static class outpurer
system.out.println();
}} public static synchronized void output2(string name)
system.out.println();
} }}
此**synchronized關鍵字鎖住的是位元組碼物件。
不論是同步**塊還是同步方法(包括靜態同步方法),只要他們使用的鎖是同乙個物件就可以實現互斥,即同步
同時獲取2類鎖
同時獲取類鎖和物件鎖是允許的,並不會產生任何問題,但使用類鎖時一定要注意,一旦產生類鎖的巢狀獲取的話,就會產生死鎖,因為每個class在記憶體中都只能生成乙個class例項物件。
同步靜態方法/靜態變數互斥體
由於乙個class不論被例項化多少次,其中的靜態方法和靜態變數在記憶體中都只由乙份。所以,一旦乙個靜態的方法被申明為synchronized。此類所有的例項化物件在呼叫此方法,共用同一把鎖,我們稱之為類鎖。一旦乙個靜態變數被作為synchronized block的mutex。進入此同步區域時,都要先獲得此靜態變數的物件鎖
synchronized的缺陷:
當某個執行緒進入同步方法獲得物件鎖,那麼其他執行緒訪問這裡物件的同步方法時,
必須等待或者阻塞,這對高併發的系統是致命的,這很容易導致系統的崩潰。如果某個執行緒在同步方法裡面發生了死迴圈,
那麼它就永遠不會釋放這個物件鎖,那麼其他執行緒就要永遠的等待。這是乙個致命的問題。
Java中的執行緒互斥問題
有如下 public class traditionalthreadsynchronized public void init catch interruptedexception e outputer.out bbbbbbbbb start new thread new runnable catc...
java網路程式設計 執行緒的互斥
執行緒互斥是指某一資源同時只允許乙個訪問者 程式呼叫 對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。引例 package cn.sundroid.thread public class testsynchronized private void init c...
java多執行緒 二 執行緒的互斥
多執行緒相對於單執行緒而言,大大的提高了硬體cpu的使用率,提高了處理的速度。任何事物帶來的都是兩面性的,多執行緒為我們帶來效能提高的同時也帶來了許多的安全性問題。說互斥之前,先說一下什麼是互斥,舉個列子,一天去atm機取錢,如果沒有互斥的話,你正取著錢突然有個人衝進來把你的錢搶走了。這時候你想,要...