Java 多线程常见问题
生活随笔
收集整理的這篇文章主要介紹了
Java 多线程常见问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
上下文切換
多線程并不一定是要在多核處理器才支持的,就算是單核也是可以支持多線程的。 CPU 通過給每個線程分配一定的時間片,由于時間非常短通常是幾十毫秒,所以 CPU 可以不停的切換線程執行任務從而達到了多線程的效果。
但是由于在線程切換的時候需要保存本次執行的信息(詳見),在該線程被 CPU 剝奪時間片后又再次運行恢復上次所保存的信息的過程就成為上下文切換。
上下文切換是非常耗效率的。
通常有以下解決方案:
- 采用無鎖編程,比如將數據按照?Hash(id)?進行取模分段,每個線程處理各自分段的數據,從而避免使用鎖。
- 采用 CAS(compare and swap) 算法,如?Atomic?包就是采用 CAS 算法(詳見)。
- 合理的創建線程,避免創建了一些線程但其中大部分都是出于?waiting?狀態,因為每當從?waiting?狀態切換到?running狀態都是一次上下文切換。
死鎖
死鎖的場景一般是:線程 A 和線程 B 都在互相等待對方釋放鎖,或者是其中某個線程在釋放鎖的時候出現異常如死循環之類的。這時就會導致系統不可用。
常用的解決方案如下:
- 盡量一個線程只獲取一個鎖。
- 一個線程只占用一個資源。
- 嘗試使用定時鎖,至少能保證鎖最終會被釋放。
資源限制
當在帶寬有限的情況下一個線程下載某個資源需要?1M/S,當開 10 個線程時速度并不會乘 10 倍,反而還會增加時間,畢竟上下文切換比較耗時。
如果是受限于資源的話可以采用集群來處理任務,不同的機器來處理不同的數據,就類似于開始提到的無鎖編程。
總結
以上是生活随笔為你收集整理的Java 多线程常见问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pycharm下找不到要安装的模块包(如
- 下一篇: synchronized 关键字原理