獲取單例對象須要保證線程安全,其中的方法也要保證線程安全。java
建立線程或線程池時請指定有意義的線程名稱,方便出錯時回溯。數據庫
線程資源必須經過線程池提供,不容許在應用中自行顯式建立線程。緩存
線程池不容許使用 Executors 去建立,而是經過 ThreadPoolExecutor 的方式,這樣的處理方式讓寫的同窗更加明確線程池的運行規則,規避資源耗盡的風險。安全
FixedThreadPool 和 SingleThreadPool: 容許的請求隊列長度爲 Integer.MAX_VALUE,可能會堆積大量的請求,從而致使 OOM。數據結構
CachedThreadPool 和 ScheduledThreadPool: 容許的建立線程數量爲 Integer.MAX_VALUE,可能會建立大量的線程,從而致使 OOM。多線程
SimpleDateFormat 是線程不安全的類,通常不要定義爲static變量,若是定義爲 static,必須加鎖,或者使用 DateUtils 工具類。併發
高併發時,同步調用應該去考量鎖的性能損耗。能用無鎖數據結構,就不要用鎖; 能鎖區塊,就不要鎖整個方法體; 能用對象鎖,就不要用類鎖。dom
對多個資源、數據庫表、對象同時加鎖時,須要保持一致的加鎖順序,不然可能會造 成死鎖。異步
併發修改同一記錄時,避免更新丟失,須要加鎖。要麼在應用層加鎖,要麼在緩存加 鎖,要麼在數據庫層使用樂觀鎖,使用 version 做爲更新依據。高併發
多線程並行處理定時任務時,Timer 運行多個 TimerTask 時,只要其中之一沒有捕獲拋出的異常,其它任務便會自動終止運行,使用 ScheduledExecutorService 則沒有這個問題。
使用 CountDownLatch 進行異步轉同步操做,每一個線程退出前必須調用 countDown 方法,線程執行代碼注意 catch 異常,確保 countDown 方法能夠執行,避免主線程沒法執行至 await 方法,直到超時才返回結果。
避免 Random 實例被多線程使用,雖然共享該實例是線程安全的,但會因競爭同一 seed 致使的性能降低。
經過雙重檢查鎖(double-checked locking)實現延遲初始化的優 化問題隱患,只要不是特別老的JDK版本(1.4如下),雙檢鎖是沒問題的。
volatile 解決多線程內存不可見問題。 對於一寫多讀,是能夠解決變量同步問題,可是若是多寫,是沒法解決線程安全問題的。
HashMap 在容量不夠進行 resize 時因爲高併發可能出現死鏈,致使 CPU 飆升,在開發過程當中注意規避此風險。
ThreadLocal 沒法解決共享對象的更新問題,ThreadLocal 對象建議使用 static 修飾。這個變量是針對一個線程內全部操做共有的,因此設置爲靜態變量,全部此類實例共享此靜態變量,也就是說在類第一次被使用時裝載,只分配一塊存儲空間,全部此類的對象(只要是這個線程內定義的)均可以操控這個變量。