java中的locksupport_详解Java多线程编程中LockSupport
LockSupport是用來(lái)創(chuàng)建鎖和其他同步類的基本線程阻塞原語(yǔ)。
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 很類似于二元信號(hào)量(只有1個(gè)許可證可供使用),如果這個(gè)許可還沒(méi)有被占用,當(dāng)前線程獲取許可并繼 續(xù) 執(zhí)行;如果許可已經(jīng)被占用,當(dāng)前線 程阻塞,等待獲取許可。
運(yùn)行該代碼,可以發(fā)現(xiàn)主線程一直處于阻塞狀態(tài)。因?yàn)?許可默認(rèn)是被占用的 ,調(diào)用park()時(shí)獲取不到許可,所以進(jìn)入阻塞狀態(tài)。
如下代碼:先釋放許可,再獲取許可,主線程能夠正常終止。LockSupport許可的獲取和釋放,一般來(lái)說(shuō)是對(duì)應(yīng)的,如果多次unpark,只有一次park也不會(huì)出現(xiàn)什么問(wèn)題,結(jié)果是許可處于可用狀態(tài)。
LockSupport是可不重入 的,如果一個(gè)線程連續(xù)2次調(diào)用 LockSupport .park(),那么該線程一定會(huì)一直阻塞下去。
這段代碼打印出a和b,不會(huì)打印c,因?yàn)榈诙握{(diào)用park的時(shí)候,線程無(wú)法獲取許可出現(xiàn)死鎖。
下面我們來(lái)看下LockSupport對(duì)應(yīng)中斷的響應(yīng)性
最終線程會(huì)打印出thread over.true。這說(shuō)明 線程如果因?yàn)檎{(diào)用park而阻塞的話,能夠響應(yīng)中斷請(qǐng)求(中斷狀態(tài)被設(shè)置成true),但是不會(huì)拋出InterruptedException 。
LockSupport函數(shù)列表
LockSupport示例對(duì)比下面的“示例1”和“示例2”可以更清晰的了解LockSupport的用法。
示例1
示例2
運(yùn)行結(jié)果:
說(shuō)明:park和wait的區(qū)別。wait讓線程阻塞前,必須通過(guò)synchronized獲取同步鎖。
總結(jié)
以上是生活随笔為你收集整理的java中的locksupport_详解Java多线程编程中LockSupport的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java8学习_java8学习
- 下一篇: java hashmap object_