多線程的挑戰

一、併發不必定會快於串行,由於併發受限於不少因素,這些因素主要有:上下文切換,死鎖,硬件資源(CPU核心數),軟件資源(鎖的數量)。算法

二、單核處理器一樣能夠運行多線程,這個時候CPU經過給每一個線程分配CPU時間片來實現這個機制,由於時間片很是短,因此線程之間的切換是宏觀沒法感知,微觀上來說仍是串行的,這就是宏觀並行,微觀串行。若是線程數遠遠大於CPU核心數,那麼不一樣的線程與線程之間須要相互切換來獲取CPU資源,因此這是很是耗時的,所以資源受限的狀況,並行並不必定因爲串行。數據庫

三、測試上下文切換可以使用 Lmbench3 vmstat jstack 等工具命令查看。編程

四、減小上下文切換能夠經過 無鎖併發編程,CAS算法,使用最少線程(這個很難衡量,只是一個相對概念,由於線程太多,資源太少,致使大量線程等待,性能反而不樂觀)。多線程

五、死鎖致使併發程序出現不可用。兩個線程t1,t2,程序運行時t1擁有鎖1,與此同時,t2擁有鎖2,這個時候t1想要繼續運行而且想要獲取鎖2,那麼t1必須等待t2釋放鎖2,但是t2線程也正須要獲取鎖1線程才能運行完,那麼t2就要等等t1釋放鎖1.這樣t1和t2相互等待,造成死鎖。併發

六、避免死鎖的幾種方法:工具

1)避免在一個線程內同時獲取多個鎖性能

2)避免一個線程在鎖內同時還去佔用其餘鎖測試

3)儘可能使用定時鎖,lock.tryLock(timeout) ,超時以後自動釋放鎖,根據業務決定線程

七、其餘硬件和軟件資源的限制資源

1)多線程下載也會受到寬帶大小的限制

2)IO讀寫速度

3)數據庫鏈接數,Socket鏈接數等,受限的資源也是影響併發的一個因素。

相關文章
相關標籤/搜索