1. 程式人生 > >《Java並發編程的藝術》並發編程的挑戰(一)

《Java並發編程的藝術》並發編程的挑戰(一)

包括 速度 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並發編程的藝術》並發編程的挑戰(一)