Java多線程總結(二)

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

相關文章
相關標籤/搜索