上下文切換
多執行緒並不一定是要在多核處理器才支援的,就算是單核也是可以支援多執行緒的。 cpu 通過給每個執行緒分配一定的時間片,由於時間非常短通常是幾十毫秒,所以 cpu 可以不停的切換執行緒執行任務從而達到了多執行緒的效果。
上下文切換是非常耗效率的。
通常有以下解決方案:
採用無鎖程式設計,比如將資料按照 hash(id) 進行取模分段,每個執行緒處理各自分段的資料,從而避免使用鎖。
採用 cas(compare and swap) 演算法,如 atomic 包就是採用 cas 演算法(詳見)。
合理的建立執行緒,避免建立了一些執行緒但其中大部分都是出於 waiting 狀態,因為每當從 waiting 狀態切換到 running 狀態都是一次上下文切換。
死鎖 死鎖的場景一般是:執行緒 a 和執行緒 b 都在互相等待對方釋放鎖,或者是其中某個執行緒在釋放鎖的時候出現異常如死迴圈之類的。這時就會導致系統不可用。
常用的解決方案如下:
盡量乙個執行緒只獲取乙個鎖。
乙個執行緒只占用乙個資源。
嘗試使用定時鎖,至少能保證鎖最終會被釋放。
如果是受限於資源的話可以採用集群來處理任務,不同的機器來處理不同的資料,就類似於開始提到的無鎖程式設計。
Java 多執行緒常見問題
多執行緒並不一定是要在多核處理器才支援的,就算是單核也是可以支援多執行緒的。cpu 通過給每個執行緒分配一定的時間片,由於時間非常短通常是幾十毫秒,所以 cpu 可以不停的切換執行緒執行任務從而達到了多執行緒的效果。上下文切換是非常耗效率的。通常有以下解決方案 死鎖的場景一般是 執行緒 a 和執行緒...
Java 多執行緒常見問題
多執行緒並不一定是要在多核處理器才支援的,就算是單核也是可以支援多執行緒的。cpu 通過給每個執行緒分配一定的時間片,由於時間非常短通常是幾十毫秒,所以 cpu 可以不停的切換執行緒執行任務從而達到了多執行緒的效果。上下文切換是非常耗效率的。通常有以下解決方案 死鎖的場景一般是 執行緒 a 和執行緒...
Java 面試常見問題
介面抽象類 區別成員變數 抽象類可以是變數也可以是常量,介面只能是常量 關鍵字 抽象類abstract 介面是inte ce 構造方法 介面沒有構造方法,抽象類有構造方法 成員方法 抽象類可以有非抽象方法,而介面不能有 介面可以多實現,而抽象類只能單繼承 介面可以同時繼承多個介面 相同點不能直接例項...