併發程式設計初探

2021-08-01 07:35:46 字數 1768 閱讀 6493

併發程式設計的目的是為了讓程式執行得更快,但是,並不是啟動更多的執行緒就能讓程式最大限度地併發執行。在進行併發程式設計時,如果希望通過多執行緒執行任務讓程式執行得更快,會面臨許多挑戰,比如上下文切換的問題、死鎖的問題,以及受限於硬體和軟體的資源限制問題,本章會介紹幾種併發程式設計的挑戰以及解決方案。

我們都知道,即使是單核處理器也支援多執行緒執行**,cpu通過時間片(一般是數十ms)分配演算法來給每個執行緒分配cpu時間讓多執行緒機制得以實現。因為時間片非常短,所以我們感覺多個執行緒是同時執行的。

那什麼是上下文切換呢?舉個栗子,當執行緒a執行到某一步時,此時cpu將時間讓給了執行緒b進行執行,那麼在切換前,系統會儲存此時執行緒a所執行任務的狀態,那麼當下一次切換回執行緒a繼續執行時,就可以再載入這個任務的狀態,並繼續執行下去。像這樣的,任務從儲存到再載入的過程就是一次上下文切換

下方的**演示序列和併發執行並累加操作的時間,請分析:下面的**併發執行一定比序列執行快嗎?

public

class concurrencytest

private

static

void

concurrency() throws interruptedexception

}});

thread.start();

int b = 0;

for (long i = 0; i < count; i++)

long time = system.currenttimemillis() - start;

thread.join();

system.out.println("concurrency :" + time + "ms,b=" + b);

}private

static

void

serial()

int b = 0;

for (long i = 0; i < count; i++)

long time = system.currenttimemillis() - start;

system.out.println("serial:" + time + "ms,b=" + b + ",a=" + a);}}

測試結果如下:

可以發現,如果累加操作的次數沒有超過百萬次,那麼序列執行結果消耗的時間會比並行執行的時間要少,這是為什麼呢?因為執行緒有建立和上下文切換的開銷。

所以在有些情況下我們需要盡可能的減少上下文切換的次數。

通常有以下幾種方法:

public

class

deadlockdemo

private

void

deadlock() catch (interruptedexception e)

synchronized (b) }}

});thread t2 = new thread(new runnable() }}

});t1.start();

t2.start();}}

這段**只是作為演示,在實際編碼中不會寫出這樣的**。但是,在複雜的場景中,可能會遇到這樣的問題,比如t1拿到鎖之後,因為一些異常情況沒有釋放鎖(死迴圈)。又或者是t1拿到乙個資料庫鎖,釋放鎖的時候丟擲了異常,沒釋放掉。

現在我們介紹避免死鎖的幾個常見方法。

python 併發程式設計初探(程序篇)

from multiprocessing import process import time deftask name print s is running name time.sleep 3 print s is over name if name main 1 建立乙個物件 p process...

erlang初涉及5 併發程式設計初探

看完順序erlang後就可以看看併發程式了,主要接觸到的是spawn send和receive指令。spawn是建立乙個並行程序,send是向某個程序傳送訊息,receive則是接收訊息。pid spawn mod func args 建立乙個新的併發程序來執行mode模組中定義的func 函式,a...

併發 讀寫鎖初探

兩個執行緒同時讀取同乙個共享資源沒有任何問題 如果乙個執行緒對共享資源進行寫操作,此時就不能有其他執行緒對共享資源進行讀寫 讀操作觸發條件 沒有執行緒正在執行寫操作 沒有執行緒在等待執行寫操作 寫操作觸發條件 沒有執行緒正在執行讀寫操作 readwritelockl類中通過讀鎖 寫鎖以兩個鎖的狀態控...