JAVA 併發程式設計 同步工具類

2021-09-02 12:47:37 字數 4078 閱讀 3698

countdownlatch 閉鎖

閉鎖是一種同步工具類,可以延遲線程的進度知道其到達終止狀態。閉鎖的作用相當於一扇門(await):在閉鎖到達結束狀態之前,這扇門一直是關閉的,不允許任何執行緒通過,當到達結束狀態時(所有執行緒均到達countdown),這扇門會開啟並且允許所有的執行緒通過。而且,當門開啟了,就永遠保持開啟狀態。

作用:1、確保某些活動直到其他活動都完成後才繼續執行。

2、確保某個服務在其依賴的所有其他服務都已經啟動之後才啟動。

3、等待直到某個操作的所有參與者都就緒再繼續執行。

public class countdownlatchtest  catch (interruptedexception e) 

system.out.println("start lauch!!");

} public static class father implements runnable

@override

public void run()

} public static class mother implements runnable

@override

public void run()

} public static class grandmaandlizzy implements runnable

@override

public void run()

}}

futuretask

futuretask 實現了future介面,表示一種抽象的可生成結果(可撤銷、超時get)的計算。

futurtask 表示的計算是通過callable 來實現的,相當於一種可生成結果的runnable,可以處於以下三種狀態:等外執行、正在執行和執行完成。「執行完成」表示計算的所有可能結束方式,包括正常結束、由於取消而結束和由於異常而結束等。當futuretask進入完成狀態後,它會永遠停止在這個狀態上。

futuretask.get()的行為取決於任務的狀態,如果任務已經完成,那麼get會立即返回結果,否則get將阻塞知道任務進入完成狀態,然後返回結果或者丟擲異常。futuretask將計算結果從執行計算的執行緒傳遞到獲取這個結果的執行緒,而且futuretask的規範確保了這種傳遞過程能實現結果的安全發布。

futurtask在executor框架中表示非同步任務。

public class myfuturetaskdemo 

});try catch (interruptedexception e) catch (executionexception e)

}}

semaphore 訊號量

可以用來控制同時訪問某個特定資源的運算元量,或者同時執行某個指定操作的數量。計數訊號量還可以用來實現某種資源池,或者對容器施加邊界。

acquire從此訊號量獲取乙個許可,在提供乙個許可前一直將執行緒阻塞,否則執行緒被中斷。獲取乙個許可(如果提供了乙個)並立即返回,將可用的許可數減 1。

release釋放乙個許可,將其返回給訊號量。釋放乙個許可,將可用的許可數增加 1。如果任意執行緒試圖獲取許可,則選中乙個執行緒並將剛剛釋放的許可給予它。然後針對執行緒安排目的啟用(或再啟用)該執行緒。

public class mysemaphoredemo 

// 申請資源

public void getresource() throws interruptedexception

// 釋放資源

public void releaseresource()

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

}}).start();

} }}

cyclicbarrier 柵欄

cyclicbarrier 是乙個同步輔助類,它允許一組執行緒互相等待,直到到達某個公共屏障點 (common barrier point)。在涉及一組固定大小的執行緒的程式中,這些執行緒必須不時地互相等待,此時 cyclicbarrier 很有用。因為該 barrier 在釋放等待執行緒後可以重用,所以稱它為迴圈 的 barrier。

cyclicbarrier 支援乙個可選的 runnable 命令,在一組執行緒中的最後乙個執行緒到達之後(但在釋放所有執行緒之前),該命令只在每個屏障點執行一次。若在繼續所有參與執行緒之前更新共享狀態,此屏障操作 很有用。

cyclicbarrier 類似於閉鎖,它能阻塞一組執行緒直到某個事件發生。柵欄與閉鎖的關鍵區別在於,所有執行緒必須同時到達柵字段置,才能繼續執行。閉鎖用於等待事件,而柵欄用於等待其他先。

public class mybarrierdemo 

});new thread(new father(barrier)).start();

new thread(new mother(barrier)).start();

new thread(new grandmaandlizzy(barrier)).start();

} public static class father implements runnable

@override

public void run() catch (interruptedexception e) catch (brokenbarrierexception e)

system.out.println("every arrive ,start lauch!!");

} }public static class mother implements runnable

@override

public void run() catch (interruptedexception e) catch (brokenbarrierexception e)

system.out.println("every arrive ,start lauch!!");

} }public static class grandmaandlizzy implements runnable

@override

public void run() catch (interruptedexception e) catch (brokenbarrierexception e)

system.out.println("every arrive ,start lauch!!");

} }}

exchanger 雙邊柵欄

exchanger 是一種兩方柵欄:各方柵欄在阻塞位置上交換資料(雙方都達到阻塞位置時)。當兩方執行不對稱的操作時,會非常有用。當兩個執行緒通過exchanger交換物件時,這種交換就把這兩個物件安全的發布給另一方。

public class exchangetest 

static class producer extends thread

@override

public void run() else

try catch (interruptedexception e)

if (list.size() == 5) else

system.out

.println("***************===producer********************==");

}} }

static class consumer extends thread

public void run() else

try catch (interruptedexception e)

if (list.size() == 5) else

system.out

.println("***************===consumer********************==");

}} }

}

java併發程式設計 Exexctors 工具類

executors 類提供了一系列靜態工廠方法用於建立各種執行緒池。創建固定大小的執行緒池。每次提交乙個任務就建立乙個執行緒,直到執行緒達到執行緒池的最大大小。執行緒池的大小一旦達到最大值就會保持不變,如果某個執行緒因為執行異常而結束,那麼執行緒池會補充乙個新執行緒。如果執行緒池中的所有執行緒都處於...

JDK同步控制工具,JAVA高併發程式設計

同步控制是併發程式的重要手段之一,我們平常用過最多的synchronized就是其中一種簡單的方法,此外還有object.wait object.notify 等方法。在jdk之中,還有其他好用的工具。乙個可重入的互斥鎖lock,它具有與使用synchronized方法和語句所訪問的隱式監視器鎖相同...

Java併發工具類

目錄 1.等待多執行緒完成的countdownlatch 2.同步屏障cyclicbarrier 3.控制併發執行緒數的semaphore 4.執行緒間交換資料的exchanger countdownlatch允許乙個或多個執行緒等待其他執行緒完成操作,類似於join方法。join的實現原理是不停的...