LockSupport的park和unpark
????? LockSupport是JDK中比較底層的類,用來(lái)創(chuàng)建鎖和其他同步工具類的基本線程阻塞原語(yǔ)。
?????Java鎖和同步器框架的核心AQS:AbstractQueuedSynchronizer,就是通過(guò)調(diào)用LockSupport.park()和LockSupport.unpark()實(shí)現(xiàn)線程的阻塞和喚醒的。LockSupport很類似于二元信號(hào)量(只有1個(gè)許可證可供使用),如果這個(gè)許可還沒(méi)有被占用,當(dāng)前線程獲取許可并繼續(xù)執(zhí)行;如果許可已經(jīng)被占用,當(dāng)前線程阻塞,等待獲取許可。
???? LockSupport中的park() 和 unpark() 的作用分別是阻塞線程和解除阻塞線程,而且park()和unpark()不會(huì)遇到“Thread.suspend 和 Thread.resume所可能引發(fā)的死鎖”問(wèn)題。因?yàn)閜ark() 和 unpark()有許可的存在;調(diào)用 park() 的線程和另一個(gè)試圖將其 unpark() 的線程之間的競(jìng)爭(zhēng)將保持活性。
LockSupport函數(shù)列表
// 返回提供給最近一次尚未解除阻塞的 park 方法調(diào)用的 blocker 對(duì)象,如果該調(diào)用不受阻塞,則返回 null。
static Object getBlocker(Thread t)
// 為了線程調(diào)度,禁用當(dāng)前線程,除非許可可用。
static void park()
// 為了線程調(diào)度,在許可可用之前禁用當(dāng)前線程。
static void park(Object blocker)
// 為了線程調(diào)度禁用當(dāng)前線程,最多等待指定的等待時(shí)間,除非許可可用。
static void parkNanos(long nanos)
// 為了線程調(diào)度,在許可可用前禁用當(dāng)前線程,并最多等待指定的等待時(shí)間。
static void parkNanos(Object blocker, long nanos)
// 為了線程調(diào)度,在指定的時(shí)限前禁用當(dāng)前線程,除非許可可用。
static void parkUntil(long deadline)
// 為了線程調(diào)度,在指定的時(shí)限前禁用當(dāng)前線程,除非許可可用。
static void parkUntil(Object blocker, long deadline)
// 如果給定線程的許可尚不可用,則使其可用。
static void unpark(Thread thread)
說(shuō)明:LockSupport是通過(guò)調(diào)用Unsafe函數(shù)中的接口實(shí)現(xiàn)阻塞和解除阻塞的。
park和wait的區(qū)別
在調(diào)用對(duì)象的Wait之前當(dāng)前線程必須先獲得該對(duì)象的監(jiān)視器(Synchronized),被喚醒之后需要重新獲取到監(jiān)視器才能繼續(xù)執(zhí)行。
而LockSupport并不需要獲取對(duì)象的監(jiān)視器。LockSupport機(jī)制是每次unpark給線程1個(gè)"許可"——最多只能是1,而park則相反,如果當(dāng)前線程有許可,那么park方法會(huì)消耗1個(gè)并返回,否則會(huì)阻塞線程直到線程重新獲得許可,在線程啟動(dòng)之前調(diào)用 park/unpark方法沒(méi)有任何效果。
因?yàn)樗鼈儽旧淼膶?shí)現(xiàn)機(jī)制不一樣,所以它們之間沒(méi)有交集,也就是說(shuō)LockSupport阻塞的線程,notify/notifyAll沒(méi)法喚醒.
總結(jié)下 LockSupport的park/unpark和Object的wait/notify:
- 面向的對(duì)象不同;
- 跟Object的wait/notify不同LockSupport的park/unpark不需要獲取對(duì)象的監(jiān)視器;
- 實(shí)現(xiàn)的機(jī)制不同,因此兩者沒(méi)有交集。
雖然兩者用法不同,但是有一點(diǎn), LockSupport 的park和Object的wait一樣也能響應(yīng)中斷.
?
轉(zhuǎn)載于:https://www.cnblogs.com/moonandstar08/p/5132012.html
總結(jié)
以上是生活随笔為你收集整理的LockSupport的park和unpark的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 批处理之计划任务at和schtasks
- 下一篇: 水系图一般在哪里找得到_Nano Ene