如何幹掉多線程
幹掉多線程的目的是爲了幹掉鎖,幹掉爭用,減少開發的難度及提高系統的穩定性,可理解性,易維護性。
以階段來劃分系統的話,有多種劃分方法。比如業務意義上的階段,或模塊意義上的階段。但是這樣的劃分總是有點畫蛇添足的感覺:計算機並不懂業務,它也不懂模塊。它什麼都不懂。它懂的只有指令。兩種指令:內存指令與IO指令。本來這兩者都只是處理器的事情,跟我並沒有關係。但是IO指令會將線程掛起,線程跟我有關係。因爲它承載我的“任務”。
這樣劃分的話,我至少得到兩種階段:IO階段與非IO階段。具體設計可能採用2個階段,也可能採用10個階段。但所有的階段要麼屬於I/O階段要麼不屬於。
採用階段模式的好處是,系統沒有併發。系統存在的只有一些階段與中間結果。即使在面向對象的系統中,經過適當的設計仍然可以完全避免掉階段之間的數據共享(因爲面向對象的系統是有狀態的系統,所以很容易產生數據共享----相反的是,這卻正是面向過程系統最大的好處。因爲它無狀態所以使得服務器端的開發異常容易----同時也證明了面向對象開發的高成本特徵:高開發成本,低進化成本。而面向過程則是:低開發成本,高進化成本)的情況。
多道程序設計即多線(進)程本來就是爲了I/O適配而產生的。目的是使得系統在等待I/O設備就緒以前有別的事情可以做,以致於不浪費系統在等待I/O期間的CPU週期。但是分階段一樣可以做到它。兩者的區別不過是一個是從縱向對用戶任務進行的切分,一個則是從橫向進行的切分。而兩者在提高CPU利用率的方法這一點上其實是一致的:都是“分而治之”。分開的部分可以獨立運行,CPU利用率自然就提高了。
實現技術上,有幾種模式可以考慮應用於這種分階段設計:Future, Callback, Actor。見:
http://www.cnblogs.com/uptownBoy/articles/1772483.html(什麼是Future)
I/O被拿出來單獨處理的好處有:
1,在以數據庫爲中心的系統中,如果使用事務的話,幾乎不需要同步。即使需要同步,同步也只存在於本來阻塞就很嚴重的I/O線程,不影響其它線程。同步被侷限在I/O層還有一個好處是,系統更穩定。因爲這樣的系統總比那些通常到處都是同步的面向對象系統好得多(什麼是線程安全?誰來負責那麼多的同步?在一個面向對象的系統中。。。);
2,集中在一起的I/O操作更容易管理或優化;
3,因I/O阻塞而產生的線程開銷最小化。實際上,I/O將只阻塞在自己上面。也就是I/O將相互阻塞。也就是說,系統的堆棧空間浪費被最小化;
4,如果線程數量被設定爲與處理器相同的數量的話,在這種模式下,線程之間的切換會很少發生。大幅減少了因線程切換產生的處理器資源直接損失以及間接損失如緩存失效,內存屏障,寄存器重新載入,指令重排序等。