21.1 公平鎖,非公平鎖 預設非公平鎖
21.2 可重入鎖(遞迴鎖)
synchronized
public
class
reentrantlockdemo).
start()
;new
thread((
)->).
start()
;}}class
phone
public
synchronized
void
call()
}
lock
public
class
reentrantlockdemo).
start()
;new
thread((
)->).
start()
;}}class
phone
finally
}public
void
call()
finally
}}
21.3 自旋鎖(cas)
while迴圈比較直到條件成立
public
class
myspinlock
catch
(interruptedexception e)
finally})
.start()
;new
thread((
)->).
start()
;new
thread((
)->
catch
(interruptedexception e)
finally})
.start()
;new
thread((
)->).
start()
;}atomicreference
reference =
newatomicreference
();public
void
mylock()
}private
void
myunlock()
}
21.4 死鎖
產生條件:
public
class
mydeadlockdemo
implements
runnable
private user locka;
private user lockb;
public
mydeadlockdemo
(user locka, user lockb)
@override
public
void
run(
)catch
(interruptedexception e)
synchronized
(lockb)}}
}class
user
死鎖排查1、使用jps -l 定位程序號
2、使用jstack 程序號 定位死鎖問題
synchronized鎖的優化
jdk6後不斷優化,synchronized提供了三種鎖的實現,偏向鎖,輕量級鎖,重量級鎖,還提供自動的公升級和降級機制;
偏向鎖是為了在沒有多執行緒競爭的情況下儘量減少鎖帶來的效能開銷,在鎖物件的物件頭上有乙個threadid欄位,當乙個執行緒訪問鎖時,如果該鎖沒有被其他執行緒訪問過,即threadid為空,那麼jvm讓其持有偏向鎖,並將threadid的值設定為當前執行緒的id,可重入鎖,當該執行緒下一次訪問時,比較threadid和執行緒id是否一致,如果一致,該執行緒不會重複獲取鎖,從而提高程式的執行效率。
如果出現鎖的競爭情況,偏向鎖被撤銷公升級為輕量級鎖,如果資源競爭非常激烈,會公升級為重量級鎖。
無線程競爭時偏向鎖 , 有程競爭時輕量級鎖(自旋鎖),
執行緒競爭激烈時 重量級鎖:等待對列 --》需要作業系統排程 重量級鎖
當執行緒數數較少時,自旋鎖效率高,執行緒數多時重量級鎖效率高(自旋鎖會占用大量cpu資源)
JUC併發程式設計
併發程式設計的本質 充分利用cpu的資源 執行緒就是乙個單獨的資源類,沒有任何的附屬操作。傳統的synchronize鎖本質 佇列,鎖 lock.lock 加鎖 trynew reentrantlock lock.lock 加鎖 finally lock.unlock 解鎖鎖是什麼,如何判斷鎖的是誰...
juc併發程式設計
public class thraedtest string.valueof i start countdownlatch.await system.out.println 關門結束 訊號量通常用來限制執行緒數,比如限流,而不是訪問某些 物理或邏輯 資源。例如,這是乙個使用訊號量來控制對乙個專案池的...
JUC併發程式設計
juc本階段學習介紹 執行緒和程序 回顧多執行緒 傳統的synchronized鎖 lock鎖 synchronized和lock區別 傳統的生產者消費者問題 防止虛假喚醒 lock版的生產者消費者問題 condition實現精準通知喚醒 八鎖現象徹底理解鎖 copyonwritearraylist...