LockSupport提供park()和unpark()方法實現線程阻塞和喚醒。底層實現是經過sun.misc.Unsafe的park和unpark。線程
關於sun.misc.Unsafe的說明請參見個人另一篇博客。對象
核心就是經過一個信號量(permit)實現的,0阻塞,1繼續執行。博客
park時能夠指定blocker以及阻塞時長或者阻塞到什麼時間點,經過UNSAFE.park第一個boolean參數決定,true指定時間,false指定時長。it
能夠先執行unpark,再執行part的時候發現以前unpark設置爲1了,直接繼續執行,並設置信號量爲0。io
park時除了unpark或者時間到了的狀況外,阻塞的線程也會被其餘線程調用該線程的interrupt方法中斷並當即返回,thread
該過程不會拋出異常,因此調用者須要檢查線程狀態,是怎樣的方式被喚醒的。sed
park的註釋說明以下:方法
This method does <em>not</em> report which of these caused the
method to return. Callers should re-check the conditions which caused
the thread to park in the first place.異常
與wait的區別:註釋
wait須要獲取對象鎖,LockSupport不須要;
wait掛起的是當前線程,屬於隨機性,喚醒notify,notifyAll也是隨機的,LockSupport直接控制的是線程,指定線程park,指定線程unpark或interrupt