1.產生原因
臨界資源:被多個線程同時訪問的資源
如果有多個線程同時訪問同一份資源,這個資源對應的值有可能會出現值不准確的情況【臨界資源產生的原因:在多個線程訪問同一份資源的時候,如果一個線程在取值的過程中,時間片又被其他線程搶走了,臨界資源問題就產生了】
2.解決方案
當多個線程同時訪問同一份資源的時候,如果其中的一個線程搶到了時間片,如果給這個資源“上一把鎖“,這個時候其他剩余的線程只能在鎖外面進行等待
3.鎖
對象鎖:任意的對象都可以充當一把鎖
類鎖:把任意一個類當做鎖,格式:類名.class
4.使用鎖來解決臨界資源問題
1>同步代碼塊
語法:
synchronized(鎖) {
//需要訪問的臨界資源
}
說明:
a.程序執行到了這個代碼段中,就用鎖鎖住了臨界資源,這個時候,其他的線程將不能執行代碼段中的代碼,只能在鎖外面進行等待
b.當執行完代碼段中的代碼時,會自動解鎖,然后剩下的線程就可以開始爭搶cpu時間片
c.一定要保證不同的線程看到的是一把鎖,否則解決臨界資源問題沒有任何意義
同步代碼塊和對象鎖的使用
同步代碼塊和類鎖的使用
2>同步方法
語法:
sychronized 訪問權限修飾符 返回值類型 函數名(參數列表) {
//需要訪問的臨界資源
}
說明:
a.如果一個線程走到這個方法內部,就會用鎖來鎖住臨界資源,其他的線程將不能進入到這個方法的內部
b.隱式鎖,如果這個方法是靜態方法,鎖是類鎖【當前類】,如果是一個非靜態方法,則是一個對象鎖【this】
3>顯式鎖【同步鎖】
通過使用ReentrantLock這個類來進行鎖的操作,實現了Lock接口
使用ReentrantLock來進行顯式的加鎖和解鎖
lock():加鎖
unlock():解鎖