1. 程式人生 > >臨界資源的解決方法

臨界資源的解決方法

1.產生原因
臨界資源:被多個執行緒同時訪問的資源
如果有多個執行緒同時訪問同一份資源,這個資源對應的值有可能會出現值不準確的情況【臨界資源產生的原因:在多個執行緒訪問同一份資源的時候,如果一個執行緒在取值的過程中,時間片又被其他執行緒搶走了,臨界資源問題就產生了】

2.解決方案
當多個執行緒同時訪問同一份資源的時候,如果其中的一個執行緒搶到了時間片,如果給這個資源“上一把鎖“,這個時候其他剩餘的執行緒只能在鎖外面進行等待

3.鎖
物件鎖:任意的物件都可以充當一把鎖
類鎖:把任意一個類當做鎖,格式:類名.class

4.使用鎖來解決臨界資源問題
1>同步程式碼塊
語法:
synchronized(鎖) {
//需要訪問的臨界資源
}
說明:
a.程式執行到了這個程式碼段中,就用鎖鎖住了臨界資源,這個時候,其他的執行緒將不能執行程式碼段中的程式碼,只能在鎖外面進行等待
b.當執行完程式碼段中的程式碼時,會自動解鎖,然後剩下的執行緒就可以開始爭搶cpu時間片
c.一定要保證不同的執行緒看到的是一把鎖,否則解決臨界資源問題沒有任何意義

同步程式碼塊和物件鎖的使用
同步程式碼塊和類鎖的使用

2>同步方法
語法:
sychronized 訪問許可權修飾符 返回值型別 函式名(引數列表) {
//需要訪問的臨界資源
}

說明:
a.如果一個執行緒走到這個方法內部,就會用鎖來鎖住臨界資源,其他的執行緒將不能進入到這個方法的內部
b.隱式鎖,如果這個方法是靜態方法,鎖是類鎖【當前類】,如果是一個非靜態方法,則是一個物件鎖【this】

3>顯式鎖【同步鎖】
通過使用ReentrantLock這個類來進行鎖的操作,實現了Lock介面
使用ReentrantLock來進行顯式的加鎖和解鎖
lock():加鎖
unlock():解鎖