併發程式設計的挑戰

2021-08-15 10:02:12 字數 1746 閱讀 5304

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

cpu通過時間片分配演算法來迴圈執行任務,當前任務執行乙個時間片後會切換到下乙個任務。但是,在切換前會儲存上乙個任務的狀態,以便下次切換回這個任務時,可以再載入這個任務的狀態。所以任務從儲存到再載入的過程就是一次上下文的切換。因此,併發執行速度不一定會比序列執行的操作快,這是因為執行緒有建立和上下文切換的開銷,可以使用linux命令vmstat測量上下文切換到次數。看如下的**例項:

public class concurrenttest 

public static void concurrent() throws interruptedexception catch (interruptedexception e) }}

});thread.start();

int b = 0;

for (long i = 0l; i < endtag; i++)

thread.join();

long costtime = system.currenttimemillis() - starttime;

system.out.println("concurrent:" + costtime);

}public static void serial() throws interruptedexception

int b = 0;

for (long i = 0l; i < endtag; i++)

long costtime = system.currenttimemillis() - starttime;

system.out.println("serial:" + costtime);}}

上述**的輸出結果如下,結果表明使用序列化執行的速度要高於使用併發執行的速度。

concurrent:14

serial:12

減少上下文切換的方法主要有:無鎖併發程式設計、cas演算法、使用最少執行緒和使用協程。

鎖是乙個非常有用的工具,運用的場景非常多,但同時它也會帶來一些困擾,那就是有可能會引起死鎖,一旦產生死鎖,就會造成系統功能不可用。例如下面的例項**:

public class deadlockdemo  catch (interruptedexception e) 

synchronized (b) }}

});final thread thread2 = new thread(new runnable() }}

});thread1.start();

thread2.start();

}public static void main(string args)

}

一旦出現死鎖,業務是可以感知的,因為不能繼續提供服務了,那麼只能通過dump執行緒檢視到底是哪個執行緒出現了問題,例如使用jstack命令輸出下面的dump日誌,從日誌中可以看到,**發生了執行緒死鎖:

避免死鎖的幾個常用的方法如下:

併發程式設計學習 併發程式設計的挑戰

死鎖 資源限制的挑戰 併發程式設計的目的是為了讓程式執行的更快,但是並不是啟動更多的執行緒,就能讓程式最大限度的併發執行。在進行併發程式設計時,如果希望通過多執行緒執行任務讓程式執行的更快,會面臨非常多的挑戰,比如上下文切換的問題,死鎖的問題,以及受限於硬體和軟體的資源限制問題 即使是單核處理器也支...

Java併發程式設計的挑戰

併發程式設計的目的是為了讓程式執行得更快,但是,並不是執行緒啟動的越多,就能讓程式最大限度地併發執行。併發程式設計時,會面臨非常多的挑戰,比如上下文切換的問題,死鎖的問題,以及受限於各種硬體和軟體的資源限制問題。cpu通過時間片分配演算法來迴圈執行任務,當前任務執行乙個時間後會切換到下乙個任務。但是...

併發程式設計中的挑戰

併發程式設計的目的是為了讓程式執行得更快,但是,並不是啟動更多的執行緒就能讓程式最大限度地併發執行。在進行併發程式設計時,如果希望通過多執行緒執行任務讓程式執行得更快,會面臨非常多的挑戰。即使是單核處理器也支援多執行緒執行 cpu通過給每個執行緒分配cpu時間片來實現這個機制。時間片是cpu分配給各...