執行緒的同步
在多執行緒程式設計中,這種會被多個執行緒同時訪問的資源叫做臨界資源。
synchronized
關鍵字是乙個修飾符,可以修飾方法或**塊。其作用是:對於同乙個物件(不是乙個類的不同物件),當多個執行緒都同時呼叫該方法或**塊時,必須一次執行,也就是說,如果兩個或兩個以上的執行緒同時執行該段**,如果乙個執行緒已經開始執行該段**,則另外乙個執行緒必須等待這個執行緒執行完這段**才能開始執行。
多執行緒的同步提高了系統的安全問題
執行緒同步的兩種表現形式: 1.
同步**塊。
synchronzied(物件鎖)
2.同步函式。
就是在函式上加了synchronzied
關鍵字進行修飾。、
同步**塊可以使用任意物件作為鎖。
同步函式使用的鎖只有乙個,就是this。
注意:static
同步函式使用的鎖是該函式所屬類的物件。類名
.class
售票系統中的執行緒同步方法:
packagecom.hbsi; //
模擬臨界資源的類
classtickets
public
synchronized
voidaction(string name)}
//訪問資料的執行緒
classticketsthreadextendsthread
@override
public
voidrun()
}catch(interruptedexception e) }}
//測試多執行緒訪問時的問題
public
classtestmulthread2}
執行結果:
小王搶到了第
10號票
小張搶到了第9號票
小王搶到了第8號票
小張搶到了第7號票
小王搶到了第6號票
小張搶到了第5號票
小王搶到了第4號票
小張搶到了第3號票
小王搶到了第2號票
小張搶到了第1號票
售票系統中的執行緒同步**塊:
packagecom.hbsi;
public
classticket1implementsrunnablecatch(interruptedexception e)
system.out
.println(thread.currentthread().getname()+
"..."
+ticket
--);
}else}}
}public
static
voidmain(string args) }
單例類懶漢式的執行緒同步:
public class single
publicstatic single getinstance() }
return s; }
}執行緒同步以後,懶漢式的安全性就進一步的提高。
執行緒的死鎖:
產生死鎖的原因主要是
因為系統資源不足。
程序執行推進的順序不合適。
資源分配不當等。
如果系統資源充足,程序的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則就會因爭奪有限的資源而陷入死鎖。其次,程序執行推進順序與速度不同,也可能產生死鎖。
產生死鎖的四個必要條件
互斥條件:乙個資源每次只能被乙個程序使用。
請求與保持條件:乙個程序因請求資源而阻塞時,對已獲得的資源保持不放。
不剝奪條件:程序已獲得的資源,在末使用完之前,不能強行剝奪。
迴圈等待條件:若干程序之間形成一種頭尾相接的迴圈等待資源關係。
這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發生死鎖。
多執行緒的同步
1 為什麼要同步?在多個執行緒併發訪問同乙個資源的時候,可能會出現乙個執行緒對共享資源 臨界資源 進行了修改,但是該執行緒還沒有結束,這時另乙個執行緒也來對這個共享資源進行修改,後果可想而知了。舉個例子,假設甲和乙都用同乙個賬戶取錢,原來賬戶中有餘額800,甲取了800,在甲取錢之後,銀行還沒有計算...
多執行緒的同步
1 多執行緒的應用 多執行緒是為了使得多個執行緒並行的工作以完成多項任務,以提高系統的效率。使用多執行緒帶來的好處有 a 可以把佔據長時間的程式中的任務作為乙個單獨的執行緒放到後台去處理。而使用者介面可以繼續響應使用者的操作。例如使用者單擊了乙個按鈕去觸發某些事件的處理,可以彈出乙個進度條來顯示處理...
多執行緒同步
synchronized 物件 其中物件相當於乙個標誌 鎖 用於判斷 同步 塊 同步的前提必須是兩個或兩個以上的執行緒,且共用同乙個鎖 同步解決了多執行緒的安全問題 弊端 多執行緒需要判斷鎖,消耗了資源 同步函式 將synchronized放在函式名前面即可 即具有同步性質 使用的鎖是this 靜態...