Java LockSupport.park& LockSupport.unpack 爲什麼可以先unpark原理解析(圖解,生動形象例子解釋)

在這裏插入圖片描述

  • 每個線程都有自己的一個Park對象,由三個部分組成_count,_cond,和_mux打個比喻
    • 線程就像是一個程序員(這個程序員,有煙纔會敲代碼,沒煙就睡覺)
    • _cond是程序員睡覺的地方(沒有煙,程序員就不敲代碼了,就會跑這裏睡覺)
    • _counter是煙存放的地方(0表示沒有煙了,1表示有煙)
    • _mutex 互斥鎖
  • 現在列舉不同狀態這些變量的變化以及線程的運行狀態
    • 正常線程沒有執行過unpark(此時_counter=0,程序員嘴裏叼着煙),park方法執行後,程序員會立刻將煙吸完然後去睡覺。
    • park堵塞中的線程(睡眠中的程序員),執行unpark之後,_counter設置爲1,然後程序員醒來把新來的煙叼在嘴裏繼續工作(_counter設置0)
    • 正在抽菸敲代碼的程序員(正常運行中的線程),執行unpark方法後,_counter設置爲1,之後如果再執行park,程序員會立刻將手中的煙抽掉【程序員想休息了】,接着程序員發現_counter=1,然後拿着新煙(_counter設置爲0)【程序員很無奈】,繼續敲代碼。
  • 通過上面三種狀態大家應該能更深層次從原理上知道爲什麼可以提前unpark了把。(unpark提前多次不能重疊,與提前一次unpark結果一樣)

在讀大學生,碼字不易,以後還會持續更新,講述方法背後的原理(我很喜歡撥清方法背後的原理),喜歡的給個關注唄。