五、多線程中的臨界資源問題以及解決方案



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

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

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

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

同步代碼塊和對象鎖的使用
同步代碼塊和類鎖的使用

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

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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM