併發程式設計之 執行緒協作工具 LockSupport

2022-07-05 18:24:12 字數 1958 閱讀 6834

在前面的文章中,我們介紹了併發工具中的4個,samephore,cyclicbarrier,countdownlatch,exchanger,但是我們漏了乙個,非常的好用的工具,樓主在這裡必須加上。

locksupport 是乙個非常方便實用的執行緒阻塞工具,他可以在任意位置讓執行緒阻塞。並且是靜態的方法。是不是很心動?

locksupport 的靜態方法 park()可以阻塞當前執行緒,類似的還有 parknanos(),parkuntil()等,他們實現了乙個限時的等待。

同樣的,有阻塞的方法,當然有喚醒的方法,什麼呢?unpark(thread) 方法。該方法可以將指定執行緒喚醒。

我們還是來乙個例子吧,看看到底有多好用:

public class locksupportinterruptdemo 

public void run()

}system.out.println(getname() + "執行結束了");

}} public static void main(string args) throws interruptedexception

}

執行結果:

完全實現了 wait notify 的功能,但是,請注意,park 方法和 wait 方法相比,不需要獲取某個物件的鎖,也不會丟擲 interruptedexception 異常,因此,你需要像我們的例子一樣,使用靜態方法進行判斷。

如果你將 park 方法改成 park(this)/park(thread),那麼在列印 執行緒dump 資訊的時候會列印阻塞物件的詳細資訊。

該方法和 lock 介面一樣都是使用的 sun.misc.unsafe 的 park 方法實現的阻塞。

還有乙個需要注意的是:park 方法和 unpark 方法執行順序不是那麼的嚴格。比如我們在 thread 類中提到的 suspend 方法 和resume 方法,如果順序錯誤,將導致永遠無法喚醒,但 park 方法和 unpark 方法則不會,我們測試一下,將 unpark 方法緊跟著 start 方法後面執行,那麼也就是說,unpark 方法在 執行緒2 的park 方法之前執行,但結果相同。

我們將 unpark 方法移動到了 start 方法後面,依然正確執行。

什麼原因呢?這是因為 locksupport 使用了類似訊號量的機制。他為每乙個執行緒準備了乙個許可(預設不可用),如果許可能用,那麼 park 函式會立即返回,並且消費這個許可(也就是將許可變為不可用),如果許可不可用,將會阻塞。而 unpark 方法則使得乙個許可變為可用(但是和訊號量不同的是,許可不能累加,你不可能擁有超過要給許可,他永遠只有乙個)。

下面是jdk文件:

好了,到這裡,locksupport 就介紹完了,可以說,該方法可以替代 wait ,notify ,condition 的 await ,signal 方法。注意,這裡的 park 方法底層和 lock 的底層實現是一致的。都是掉喲個 sun.misc.unsafe。這個類可以說很牛逼。

good luck !!!!

併發程式設計之深入理解Lock介面

寫乙個執行緒不安全的 public class unsafethread public static void main string args catch interruptedexception e countdownlatch.countdown start while true 這裡的cou...

併發程式設計之 執行緒池

執行緒池做的工作主要是控制執行的執行緒的數量,處理過程中將任務放入佇列,然後再執行緒建立後啟動這些任務,如果執行緒數量超過了最大數量,超出數量的執行緒排隊等候,等其它執行緒執行完畢,再從佇列中取出任務來執行。他的主要特點為 執行緒復用 控制最大併發數,管理執行緒。第一 降低資源消耗。通過重複利用已建...

併發程式設計之執行緒池

步驟1 自定義拒絕策略介面 1 執行緒池狀態 threadpoolexecutor使用int的高3位來表示執行緒池狀態,低29位表示執行緒數量 從數字上比較,terminated tidying stop shutdown running 這些資訊儲存在乙個原子變數ctl中目的是將執行緒池狀態與執行...