java併發庫中的LockSupport介紹及使用

2021-07-09 09:28:24 字數 1831 閱讀 9857

在沒有接觸到locksupport類之前,我一直很疑惑jdk併發庫中的很多任務具類到底是怎麼實現讓執行緒阻塞的呢?最典型的就是futuretask,主線程呼叫get()方法會一直阻塞直到結果返回。據我所知,能讓執行緒阻塞(注意不是休眠)的實現方式是在同步塊中呼叫鎖物件的wait()方法,如下所示:

synchronized (object)  catch (interruptedexception e) 

//do something

}

但看過大神的jdk併發庫部分原始碼之後,才知道

locksupport的存在。檢視其原始碼可發現它並沒有使用標準的jdk api來實現,而是通過大名鼎鼎的unsafe工具類來呼叫作業系統底層api實現的。通過檢視其api文件,發現它也引入了「許可」的概念,大致上就是說只有獲得「許可」,執行緒才能繼續執行,否則將阻塞。常用的api如下所示:

static void park()

若當前執行緒有許可,立即返回。否則阻塞,直到某些條件發生

static void parknanos(long nanos) 

同上,並可以設定超時時間

static void park(object blocker) 

同上,並可以設定乙個標記物件,其實這個物件僅僅是方便檢視日誌

時,可以看到這個執行緒因獲取哪個鎖物件而阻塞

(看過thread dump日誌的都知道咋回事)

static void unpark(thread thread)

給定執行緒發放許可,乙個執行緒最多只能有乙個許可

(連續呼叫多次是沒有用的)

api中還需要注意locksupport.park()的特性說明:

若當前執行緒有許可,立即返回。否則阻塞,直到以下條件觸發

(1)其他執行緒呼叫了locksupport.unpark()來對該執行緒發放許可

(2)其他執行緒呼叫了該執行緒的interrupt()方法進行中斷,注意是不會丟擲interruptedexception

(3)沒有理由(意思是該方法底層實現無法完全保證執行緒一直處於阻塞,因此建議在迴圈塊呼叫該方法)

學習了以上的一些特性後,我也嘗試寫了了乙個demo來加深了解,**如下:

public class blockthread 

public thread gettargetthread()

public void block()

public void block(long timeout, timeunit unit)

private void doblock(boolean timed, long nanos)

final long deadline = timed ? system.nanotime() + nanos : 0l;

blocked = true;

while(blocked) else

}else

if(current.isinterrupted()) }}

public void unblock()

}public static void main(string args) catch (interruptedexception e)

bt.unblock();

system.out.println("unblock");

//中斷也可以

"interrupted");

}}.start();

system.out.println("block");

bt.block();

system.out.println("complete");

}}

java中的併發工具類

類名稱類的簡介 類的特點 countdownlatch 允許乙個或者多個執行緒等待其他執行緒完成之後再執行後續操作 countdownlatch提供了乙個計數器,只能初始化一次,但是提供了乙個await方法,允許設定乙個時間,當等待一段時間後,就會不再阻塞當前執行緒。cyclicbarrier 讓一...

java中的併發 執行緒通訊

目錄 1.wait notify notifyall 2.生產者消費者模式 3.多生產多消費模式 1.wait notify notifyall object類為我們定義了執行緒通訊的方法,如wait notify 等,這些方式是本地的而且是final的.1.1wait 1 呼叫wait 方法,能讓...

java 中的併發工具類簡介

1 等待多執行緒完成的countdownlatch countdownlatch允許乙個或多個執行緒等待其他執行緒完成操作。2 同步屏障cyclicbarrier cyclicbarrier的字面意思是可迴圈使用 cyclic 的屏障 barrier 它要做的事情是,讓一組執行緒到達乙個屏障 也可以...