《Java並發編程的藝術》並發編程的挑戰(一)
阿新 • • 發佈:2019-03-02
包括 速度 class 資源 多線程處理 高效 編程 ati dead
並發編程的挑戰
並發編程的初衷是讓程序運行的更快,但是更多的使用多線程真的會讓程序變快嗎?
1.線程上下文切換
關於線程上下文切換
多個線程在一個處理器裏並不是同時進行的,而是非常快速地在線程之間進行切換著運行,所以可以更高效地使用到CPU的性能。
線程上下文切換的開銷
然而在低運算量的時候,單線程可能還比多線程快,這就是因為線程上下文的切換會有一定時間上的開銷。
死鎖
先看一段例子程序:
public class DeadLock { public static Integer a = 1; public static Integer b = 2;public static void main(String[] args) { while(true) { deadLock(); } } private static void deadLock() { Thread t1 = new Thread(new Runnable() { @Override public void run() { synchronized (a) {synchronized (b) { System.out.println("1"); } } } }); Thread t2 = new Thread(new Runnable() { @Override public void run() { synchronized (a) {synchronized (b) { System.out.println("2"); } } } }); t1.start(); t2.start(); } }
這裏面一個線程就用到了多個鎖,並且鎖的順序是交叉的,這就可能出現當t1線程拿到b鎖的時候,t2線程也拿到a鎖,而此時t1線程需要a鎖,但是t2線程又拿著的,而t2線程需要b鎖,而t1線程卻也拿著的,所以導致了死鎖。所以盡量避免在一個線程裏使用多個鎖。
資源的限制
資源的限制包括CPU處理,帶寬的大小,硬盤存取速度等等,到時候如果多線程處理的速度大於它們,那麽就會被這些資源的限制就會成為程序的瓶頸,所以在多線程設計的時候可以考慮這些問題。
《Java並發編程的藝術》並發編程的挑戰(一)