1、wait和notifyhtml
Object.wait()令對象執行線程被暫停,進入WAITING狀態java
Object.notify()是喚醒一個被暫停的線程數組
線程只有在持有對象內部鎖的狀況下才能wait(),wait()會釋放鎖線程
等待線程對保護條件的判斷老是放到對象所引導的臨界區中;判斷,wait和目標動做必須放在同一個臨界區中;wait()釋放的鎖只是當前wait方法所屬對象的內部鎖,當前線程其它內部鎖,顯示鎖不釋放htm
notify()也在臨界區中,包含更新共享變量,喚醒線程兩個動做。notify自己不會釋放鎖對象
notifyAll能夠喚醒對象上全部等待線程blog
實現原理:每一個對象有一個入口集用以儲存申請內部鎖的線程,還有一個等待集存儲等待線程,wait暫停並釋放內部鎖的同時會把當前線程的引用存在對象的等待集,notify喚醒時,線程仍停留在等待集,直到線程再次持有相應內部鎖時wait會把線程從等待集中移除,而後wait的調用就反悔了接口
問題:過早喚醒,保護條件還未成立就喚醒了,這樣會繼續等待;信號丟失(代碼錯誤),wait前沒有判斷保護條件,錯過了信號而一直等待,或者該用notifyAll的地方用notify;上下文切換隊列
join方法:wait和notify實現,檢測到目標線程未結束就會調用wait,虛擬機會在目標線程run結束後調用該線程的notifyAll虛擬機
條件變量:java.util.concurrent.locks.Condition接口,定義了await()、sign()、signAll()方法,與 wait它們相似,要求對象持有顯示鎖,內部維護一個條件隊列,解決提早喚醒的方式是變量和等待線程一對多
2、生產者消費者問題
3、線程池
https://www.cnblogs.com/aspirant/p/6920418.html
4、currentHashMap
JDK7中經過鎖分段技術實現,ConcurrentHashMap是由Segment數組結構和HashEntry數組結構組成。Segment是一種可重入鎖ReentrantLock,在ConcurrentHashMap裏扮演鎖的角色
JDK8 取消鎖分段,改用CAS