Java高併發程序設計(一)-前言

一,爲什麼需要並行?
(1)業務要求:
並行計算還出於業務模型的需要
– 並不是爲了提高系統性能,而是確實在業務上需要多個執行單元。
– 比如HTTP服務器,爲每一個Socket連接新建一個處理線程
– 讓不同線程承擔不同的業務工作
– 簡化任務調度
(2)性能

需要並行的原因和說法:
Linus Torvalds :並行計算只有在圖像處理和服務端編程2個領域可以使用,並且它在這2個
領域確實有着大量廣泛的使用。但是在其它任何地方,並行計算毫無建樹! 

摩爾定律的失效
– 預計18個月會將芯片的性能提高一倍
– Intel CEO Barret單膝下跪對取消4GHz感到抱歉
• 在2004年秋季,Intel宣佈徹底取消4GHz計劃
– 雖然現在已經有了4GHZ的芯片,但頻率極限已經逼近 

頂級計算機科學家唐納德·爾文·克努斯
– 在我看來,這種現象(併發)或多或少是由於硬件設計者
– 已經無計可施了導致的,他們將摩爾定律失效的責任
– 推脫給軟件開發者。

二,幾個重要的概念
同步(synchronous)和異步(asynchronous)


併發(Concurrency)和並行(Parallelism)


臨界區 :用來表示一種公共資源或者說是共享數據,可以被多個線程使用。但是每一次,只能有一個線程
使用它,一旦臨界區資源被佔用,其他線程要想使用這個資源,就必須等待。


阻塞(Blocking)和非阻塞(Non-Blocking)
阻塞和非阻塞通常用來形容多線程間的相互影響。比如一個線程佔用了臨界區資源,那麼其它所有需要
這個資源的線程就必須在這個臨界區中進行等待,等待會導致線程掛起。這種情況就是阻塞。此時,如
果佔用資源的線程一直不願意釋放資源,那麼其它所有阻塞在這個臨界區上的線程都不能工作。
– 非阻塞允許多個線程同時進入臨界區

鎖(Deadlock)、飢餓(Starvation)和活鎖(Livelock)

鎖:如A,B,C,D四輛車,每輛車都佔用一條道路的資源,互相等待其它車輛釋放資源,形成死鎖。
活鎖:如電梯遇人,A要從電梯出去,B要進來電梯,兩人相互阻擋,並且同時在左右避讓時(釋放資源),又阻擋到對方。

並行的級別

阻塞
– 當一個線程進入臨界區後,其他線程必須等待

無障礙(Obstruction-Free)
– 無障礙是一種最弱的非阻塞調度
– 自由出入臨界區
– 無競爭時,有限步內完成操作
– 有競爭時,回滾數據

無鎖(Lock-Free)
– 是無障礙的
– 保證有一個線程可以勝出
while (!atomicVar.compareAndSet(localVar, localVar+1))
{
localVar = atomicVar.get();
}

無等待(Wait-Free)
– 無鎖的
– 要求所有的線程都必須在有限步內完成
– 無飢餓的 

三,有關並行的兩個重要定律


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章