一、集合處理
1、只要覆寫 equals,就必須覆寫 hashCode;Set集合存盤物件必須重寫hashCode和equals;自定義物件作為map的key必須重寫…

2、ArrayList 的 subList 結果不可強轉成ArrayList

3、Map集合的keySet,values,entrySet回傳集合物件時不可進行添加操作;Conllections回傳的物件,不能進行添加洗掉操作,sublist使用時,不要對原集合進行操作

4、使用集合轉陣列必須使用集合的toArray(陣列),傳入的必須是空陣列,不能使用toArray的無參方法

5、Collection介面任何實作類使用addAll()時都要進行空指標判斷,Arrays.asList()把陣列轉換成集合時,不能對陣列進行修改操作

6、泛型通配符<? extends T>不嫩使用add方法,適合經常往外取資料,
<? super T>不能使用 get 方法,適合經常插入資料,沒有泛型限制定義的集合需要進行型別判斷

7、foreach回圈里進行增刪操作,考慮使用迭代器
Comparator.sort()時,要處理三種情況

8、集合泛型定義時,使用 diamond 語法或全省略,
集合初始化時,置頂集合大小
遍歷map集合使用entrySet

9、Map集合不能為空的情況
hashMap都可以為空
treeMap值可以為空

10、合理利用好集合的有序性(sort)和穩定性(order)

二、并發處理
11、單例物件和方法要保證執行緒安全;執行緒池的名稱要有意義

12、執行緒資源必須由執行緒池來提供,執行緒池使用ThreadPoolExecutor創建,SimpleDateFormat定義為static變數時加鎖

13、必須回收自定義的 ThreadLocal 變數,盡量在代理中使用 try-finally 塊進行回收,

14、考慮鎖的性能,盡可能使加鎖的代碼塊作業量盡可能的小;保持加鎖順序一致

15、在使用阻塞等待獲取鎖的方式中,必須在 try 代碼塊之外,并且在加鎖方法與 try 代 碼塊之間沒有任何可能拋出例外的方法呼叫

16、在使用嘗試機制來獲取鎖的方式中,進入業務代碼塊之前,必須先判斷當前執行緒是 否持有鎖,鎖的釋放規則與鎖的阻塞等待方式相同,
說明:Lock 物件的 unlock 方法在執行時,它會呼叫 AQS 的 tryRelease 方法(取決于具體實作類),如果
當前執行緒不持有鎖,則拋出 IllegalMonitorStateException 例外,
例子:
Lock lock = new XxxLock(); // ...
boolean isLocked = lock.tryLock();
if (isLocked) {
try {
doSomething();
doOthers();
} finally {
lock.unlock();
}
}
17、并發修改同一記錄時,避免更新丟失,需要加鎖,要么在應用層加鎖,要么在快取 加鎖,要么在資料庫層使用樂觀鎖,使用 version 作為更新依據,
如果每次訪問沖突概率小于 20%,推薦使用樂觀鎖;
否則使用悲觀鎖,樂觀鎖的重試次數不得小于 3 次,

18、多執行緒并行處理定時任務時,Timer 運行多個 TimeTask 時,只要其中之一沒有捕獲 拋出的例外,其它任務便會自動終止運行,如果在處理定時任務時使用ScheduledExecutorService 則沒有這個問題,

19、資金相關資訊建議使用悲觀鎖,使用CountDownLatch進行異步轉同步操作確保countDown方法被執行,多執行緒情況下建議使用ThreadLocalRandom

20、多執行緒HashMap高并發可能出現死鏈,ThreadLocal不能解決共享物件更新問題

更多文章:愛敲代碼的小游子
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/230720.html
標籤:java
上一篇:基礎篇:異步編程不會?我教你啊!CompeletableFuture(JDK1.8)
下一篇:廣度優先bfs的python實作
