本文學習自博主凌瀾星空
。
併發是為了提高程式的執行速度,並不是執行緒越多越好,併發過程要注意三個問題:
1.上下文切換
2.死鎖
3.資源限制
1.執行緒的執行機制:
乙個cpu每一時刻只能執行一條主線程;
作業系統會給每條執行緒分配不同長度的時間片;
作業系統會隨機從就緒等待狀態的執行緒中隨機選取一條執行;
每條執行緒用完自己的時間片後,即使執行緒沒有執行完畢也會停止執行,作業系統隨機選取一條新執行緒執行;
2.上下文切換:當一條執行緒的時間片用完後,作業系統會停止該執行緒,並儲存當前執行緒的資訊狀態,然後選取一條新執行緒來執行。
3.上下文切換是有開銷的
每次上下文切換都需要儲存當前執行緒的執行狀態,並載入新執行緒先前狀態。如果上下文切換頻繁,那麼cpu花在上下文切換的時間佔比增加,真正處理任務的佔比就會減少,因此,為了提高處理任務的 效率,我們就要減少上線問起切換次數。
4.減少上下文切換次數
減少執行緒的數量
控制同一執行緒上鎖的數量
採用無鎖併發程式設計:1)無共享變數,獨立執行。2)有共享變數,控制執行順序(cas演算法)
1.死鎖:多條執行緒相互等待已經被對方占用的資源時產生。
2.如何避免死鎖
不要在乙個執行緒中巢狀使用多個鎖;
不要在乙個執行緒中巢狀占用多個計算機資源;
給鎖和資源加超時時間;
硬體資源:磁碟讀寫速度,頻寬等。
軟體資源:socket連線數,資料庫連線數等。
當程式執行執行緒時,並非是一行一行的執行**,要進行重排序。、
重排序:編譯器處理器在不改變程式結果的前提下,重新排列指令的執行順序,以達到最佳執行效率。
java併發程式設計(一) 併發程式設計需要注意問題
目錄 問題一上下文切換會帶來額外的開銷 執行緒的執行機制 什麼是上下文切換 上下文切換的過程 上下文切換是有開銷的 如何減少上下文切換 問題二併發不當可能會產生死鎖 什麼是死鎖 死鎖示例 如何避免死鎖 問題三計算機資源會限制併發 誤區執行緒越多速度越快 什麼是資源 如何解決資源的限制 併發是為了提公...
併發程式設計注意事項
一般在執行批處理的場景下,如果序列單執行緒的效率低,可以考慮併發,但是需要注意一些事情。首先需要確定,單個執行緒執行的場景下,耗時的 塊,一般的做法是通過列印執行時間,然後優化到合適的地步。採用多執行緒來執行任務,由於併發的不確定性以及併發引入的複雜性,要能夠保證併發處理的結果是正確的,是準確的。既...
併發程式設計中的注意事項
獲取單例物件需要保證執行緒安全,其中的方法也要保證執行緒安全。建立執行緒或執行緒池時請指定有意義的執行緒名稱,方便出錯時回溯。執行緒資源必須通過執行緒池提供,不允許在應用中自行顯式建立執行緒。執行緒池不允許使用 executors 去建立,而是通過 threadpoolexecutor 的方式,這樣...