併發程式設計的目的是為了讓程式執行得更快,但是,並不是啟動更多的執行緒就能讓程式最大限度地併發執行。在進行併發程式設計時,如果希望通過多執行緒執行任務讓程式執行得更快,會面臨許多挑戰,比如上下文切換的問題、死鎖的問題,以及受限於硬體和軟體的資源限制問題,本章會介紹幾種併發程式設計的挑戰以及解決方案。
我們都知道,即使是單核處理器也支援多執行緒執行**,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類中通過讀鎖 寫鎖以兩個鎖的狀態控...