架構學習 併發程式設計 一

2021-09-27 07:57:39 字數 3547 閱讀 1157

建立執行緒

關閉執行緒

上述三個方法關閉執行緒不推薦使用,因為執行緒不會釋放資源,並可能造成死鎖情況發生;因此推薦下述方法的使用。

如果存在interruptedexception型別異常,標誌位將被置為false

守護執行緒

守護執行緒中不要使用finally來關閉資源。因為守護執行緒為使用者執行緒服務,不會退出jvm,任何**(包括finally塊)都不會在所有使用者執行緒執行完成之後執行。

volatile

原子操作:不可中斷的乙個或一系列操作。

volatile可以保證可見性,不一定保證原子性。

適用場景:只有乙個執行緒寫,其他執行緒讀。

threadlocal

由於每個執行緒擁有乙份資料副本,因此不會互相影響。而又因為每個執行緒均複製乙份共享記憶體資料

因此不建議將大資料型別塞入threadlocal中。

等待和通知標準正規化

join()

執行緒a呼叫執行緒b的join方法,執行緒a等待執行緒b執行完畢再執行自己的邏輯。

yield()

執行緒執行到yield()以後,持有的鎖不會釋放。

sleep()

執行緒執行到sleep()以後,持有的鎖不會釋放。

wait()

呼叫方法前,必須持有鎖,呼叫wait()方法之後,鎖會被釋放;當wait()方法返回的時候,執行緒會重新持有鎖。

notify()、notifyall()

調動方法之前必須持有鎖,呼叫notify()、notifyall()方法本身不會釋放鎖。

fork/join(分而治之)

資料量為n的問題,n《閾值,直接解決;n>閾值,將n分解為k個子問題,子問題間互相對立,與原問題形式相同,最後將子問題的解合併到原問題的解返回。

同步實現:forkjoinpool的invoke()方法

非同步實現:forkjoinpool的execute()方法

countdownlatch

用途:乙個執行緒等待其他的執行緒完成工作以後再執行,加強版join

await()使執行緒等待,countdown()計數器減一

適用場景:某些資料需要初始化之後,業務執行緒才能正常執行的業務場景。

cyclicbarrier

用途:讓一組執行緒到達某乙個屏障時被阻塞,一直到組內線程均到達屏障,屏障解除,所有被阻塞執行緒會繼續執行。

await()使執行緒等待

適用場景:執行緒協作,只有不同執行緒任務完成,業務才可以向下執行。

countdownlatch和cyclicbarrier區別

1.countdownlatch放行條件由第三者控制,cyclicbarrier放行條件由一組執行緒本身控制

2.countdownlatch放行條件》=執行緒數,cyclicbarrier放行條件=執行緒數

semaphore

控制同時訪問特定資源的執行緒數量,多用於流量控制

適用場景:連線池資源控制;高併發場景限流。

exchange

兩個執行緒間進行資料交換

future、futuretask、callable

future介面定義方法

boolean

cancel

(boolean mayinterruptifrunning)

;boolean

iscancelled();

boolean

isdone();

v get

()throws interruptedexception, executionexception;

v get

(long timeout, timeunit unit)

boolean cancel(boolean mayinterruptifrunning)

嘗試取消任務的執行,取消成功返回true,取消失敗返回false;mayinterruptifrunning表示是否允許中斷正在執行的任務。

boolean iscancelled()

表示任務是否被取消成功,如果在任務正常完成前被取消成功,返回true。

boolean isdone()

表示任務是否已經完成,完成則返回true,注意:正常、異常或取消均代表任務完成。

v get()和v get(long timeout,timeunite unit)

futuretask部分**

/* possible state transitions:

* new -> completing -> normal

* new -> completing -> exceptional

* new -> cancelled

* new -> interrupting -> interrupted

*/private

volatile

int state;

private

static

final

int new          = 0;

private

static

final

int completing   = 1;

private

static

final

int normal       = 2;

private

static

final

int exceptional  = 3;

private

static

final

int cancelled    = 4;

private

static

final

int interrupting = 5;

private

static

final

int interrupted  = 6;

/** the underlying callable; nulled out after running */

private callablecallable;

/** the result to return or exception to throw from get() */

private object outcome; // non-volatile, protected by state reads/writes

/** the thread running the callable; cased during run() */

private

volatile thread runner;

/** treiber stack of waiting threads */

private

volatile waitnode waiters;

state是任務的執行狀態

callble是執行緒執行的有返回值的任務。

outcome是任務執行後的結果或異常。

waiters表示等待獲取結果的阻塞執行緒,鍊錶結構,後來執行緒會放在鍊錶前面。

學習java併發程式設計(一)

1 任務的認識 任務可以看作是乙個implements runnable的乙個類,任務的內容就是定義在run 方法中的內容 2 thread executor 當使用new thread runnable r start 時,即客戶端 也就是編寫程式的開發人員 直接在新執行緒中執行任務,而在使用ex...

併發程式設計學習 併發程式設計的挑戰

死鎖 資源限制的挑戰 併發程式設計的目的是為了讓程式執行的更快,但是並不是啟動更多的執行緒,就能讓程式最大限度的併發執行。在進行併發程式設計時,如果希望通過多執行緒執行任務讓程式執行的更快,會面臨非常多的挑戰,比如上下文切換的問題,死鎖的問題,以及受限於硬體和軟體的資源限制問題 即使是單核處理器也支...

併發程式設計(一)

該系列為併發程式設計,在幾乎所有的程式語言中,併發始終是繞不開的坎,可以說學習一門程式語言,學好了併發就說明這門語言你學的還可以.所以接下來就讓我們好好看看 python 的併發是怎麼實現的吧.在學習併發之前,有必要學習一下計算機作業系統發展史,因為可以實現併發可作業系統的發展是分不開的.作業系統的...