回覆列表
-
1 # 三石生活資訊
-
2 # Java網際網路架構
Java併發執行緒的阻塞和喚醒可分幾類:
1. synchronize基於JVM的物件頭來實現,多執行緒爭搶同一個臨界資源時根據不同的鎖機制(自旋鎖、輕/重量級鎖)來進行阻塞和喚醒。
2. notify/wait,yeild等基礎機制這裡暫時略過,大致實現原理是基於物件的同步佇列和後面的AQS很像。
3. 併發元件的基礎AQS重點說下AQS(AbstractQueuedSynchronizer),
因為這是jdk併發包實現的基礎(如Lock、BlockingQueue、CountdownLatch等)。
Aqs基本由一個volatile變數state和一個等待佇列來實現,搶鎖時先CAS修改state,失敗以後就放到等待佇列裡,並透過LockSupport將執行緒掛起。
當鎖的擁有者釋放鎖時會透過LockSupport喚醒等待佇列的後續節點,讓它再次去嘗試搶鎖(CAS修改state),如此反覆。
掌握AQS的原理對理解jdk裡很多併發元件非常有幫助。
1. sleep() 方法:以毫秒為單位,使執行緒處於阻塞狀態,時間到了過後,自動喚醒。
2.suspend() 和 resume() 方法:掛起和喚醒執行緒,suspend e()使執行緒進入阻塞狀態,只有對應的resume e()被呼叫的時候,執行緒才會進入可執行狀態。這個不建議使用,容易發生死鎖情況。
3. yield() 方法:呼叫 yield()的效果等價於排程程式認為該執行緒已執行了足夠的時間從而轉到另一個執行緒
這裡就說這三種吧,其它的你可以去csdn上門看看,學習一下