併發程式設計中的注意事項

2021-08-20 21:15:06 字數 1518 閱讀 6616

獲取單例物件需要保證執行緒安全,其中的方法也要保證執行緒安全。

建立執行緒或執行緒池時請指定有意義的執行緒名稱,方便出錯時回溯。 執行緒資源必須通過執行緒池提供,不允許在應用中自行顯式建立執行緒。

執行緒池不允許使用 executors 去建立,而是通過 threadpoolexecutor 的方式,這樣的處理方式讓寫的同學更加明確執行緒池的執行規則,規避資源耗盡的風險。

******dateformat 是執行緒不安全的類,一般不要定義為static變數,如果定義為 static,必須加鎖,或者使用 dateutils 工具類。

高併發時,同步呼叫應該去考量鎖的效能損耗。能用無鎖資料結構,就不要用鎖; 能鎖區塊,就不要鎖整個方法體; 能用物件鎖,就不要用類鎖。 對多個資源、資料庫表、物件同時加鎖時,需要保持一致的加鎖順序,否則可能會造 成死鎖。

併發修改同一記錄時,避免更新丟失,需要加鎖。要麼在應用層加鎖,要麼在快取加 鎖,要麼在資料庫層使用樂觀鎖,使用 version 作為更新依據。

多執行緒並行處理定時任務時,timer 執行多個 timertask 時,只要其中之一沒有捕獲丟擲的異常,其它任務便會自動終止執行,使用 scheduledexecutorservice 則沒有這個問題。 使用 countdownlatch 進行非同步轉同步操作,每個執行緒退出前必須呼叫 countdown 方法,執行緒執行**注意 catch 異常,確保 countdown 方法可以執行,避免主線程無法執行至 await 方法,直到超時才返回結果。

避免 random 例項被多執行緒使用,雖然共享該例項是執行緒安全的,但會因競爭同一 seed 導致的效能下降。

通過雙重檢查鎖(double-checked locking)實現延遲初始化的優 化問題隱患,只要不是特別老的jdk版本(1.4以下),雙檢鎖是沒問題的。 volatile 解決多執行緒記憶體不可見問題。 對於一寫多讀,是可以解決變數同步問題,但是如果多寫,是無法解決執行緒安全問題的。

如果是 jdk8,推薦使用 longadder 物件,比 atomiclong 效能更好(減少樂觀鎖的重試次數)。

hashmap 在容量不夠進行 resize 時由於高併發可能出現死鏈,導致 cpu 飆公升,在開發過程中注意規避此風險。

threadlocal 無法解決共享物件的更新問題,threadlocal 物件建議使用 static 修飾。這個變數是針對乙個執行緒內所有操作共有的,所以設定為靜態變數,所有此類例項共享此靜態變數,也就是說在類第一次被使用時裝載,只分配一塊儲存空間,所有此類的物件(只要是這個執行緒內定義的)都可以操控這個變數。

併發程式設計注意事項

一般在執行批處理的場景下,如果序列單執行緒的效率低,可以考慮併發,但是需要注意一些事情。首先需要確定,單個執行緒執行的場景下,耗時的 塊,一般的做法是通過列印執行時間,然後優化到合適的地步。採用多執行緒來執行任務,由於併發的不確定性以及併發引入的複雜性,要能夠保證併發處理的結果是正確的,是準確的。既...

程式設計中的注意事項

下面 編譯時,提示有未檢查的內容,執行時可能有異常。為什麼不檢查呢,因為不知道帶入的t和v就是static方法中的integer和double,所以提示有未檢查或不安全的操作,由於下面程式建立的inte ce介面的兩個引數和static方法中的吻合,所以,執行時沒有出現異常。這裡建立的inte ce...

程式設計注意事項

1.動態輸出表頭或資料 每次輸出之前,請先清空表頭以及資料再新增。2.一般資料都要分頁,請直接加上分頁 3.重複性資料的校驗 介面接收資料 1.介面接收資料,一般型別接受 例如 string 列印日誌,之後再轉換成自己想要的格式json等。需求評審 問題一 大面問題 1.是什麼?2.怎樣玩?業務流程...