java執行緒的互斥

2021-09-17 19:26:49 字數 2006 閱讀 2113

多執行緒程式中的各個執行緒都是自由執行的,所以它們有時就會同時操作同乙個例項。這在某些情況下會引發問題。例如,從銀行賬戶取款時,餘額確認部分的**應該是像下面這樣的。

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機取錢,如果沒有互斥的話,你正取著錢突然有個人衝進來把你的錢搶走了。這時候你想,要...