java線程池應用相關技術點總結

1. JSONArray、JSONObject是非線程安全的,這是因爲它們的底層分別默認是Arraylist和HashMap,非線程安全;多線程中使用它們的put/add操作等需要同步;

2. JSONArray底層默認是Arraylist,Arraylist沒有類似ConcurrentHashMap可替換HashMap的線程安全數據結構,一般直接用synchronized關鍵字同步,鎖對象是JSONArray對象,將例如add操作包起來;

JSONObject底層默認是HashMap,所以將ConcurrentHashMap作爲參數,構造JSONObject可以解決多線程問題;

3. 主線程與子線程通信(傳值),需用集合類變量,且使用集合類的put等操作,不能直接賦值;以上結論指的是使用匿名類實現的線程,例如如下形式:lambda表達式、new Runnable接口;

原因這種情況,匿名類一般通過將結果賦值給主線程中的變量,實現通信,而事實上主線程中的變量是作爲參數傳遞給匿名類,引用傳遞,從代碼層面上看(語義上),該變量對於匿名類和主線程是唯一的,若內部類對其賦值,則內部類指向該變量的符號引用將指向另一個新對象,那麼造成了語義上的錯誤,所以賦值的辦法是不行的,編譯也不會通過,只能通過集合類操作完成通信;

4. 線程池大小確定:最佳線程數目 = ((線程等待時間+線程CPU時間)/線程CPU時間 )* CPU數目;

即I/0密集的任務,應擴大線程池,因爲每個線程等待時間較長,CPU利用率低;

CPU密集的任務,線程池小一些比較好,比如CPU個數+1;

5. 線程池工作隊列大小確定:工作隊列類似於一個緩存,若工作隊列長度爲0,那麼線程池滿了將直接拒絕請求(java.util.concurrent.RejectedExecutionException),否則將進入隊列等待,若對響應時間要求不高可以這樣做;

6. ConcurrentHashMap的性能比synchronized關鍵字好,前者使用CAS算法;

7. 對應用多線程的接口,使用jmeter測試,能驗證高併發下功能正確性、發現性能瓶頸;

使用POST方法的HTTP請求時,在HTTP header manager項裏注意Content-Type設置需要的類型,一般表單給application/x-www-form-urlencoded就可以;

在view result tree裏能看見每個請求的request和response詳情(header和body),請求有問題時便於排查;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章