目前的購物車是空的!
此商品參與的優惠活動
商品庫存不足留言
編輯推薦 適讀人群 :本書適合有一定開發經驗的Java開發人員和架構師閱讀,非Java語言的開發者也能從本書獲益。1 來自真實生產環境的100多個案例、150多個坑點。2 業務代碼開發層面近20個方面的坑,涉及多線程、數據訪問、池技術、日誌異常、日期時間、IO和序列化、Spring框架等。3 項目技術設計層面6個方面的坑,涉及介面、緩存、非同步、生產就緒、代碼重複、數據存儲。4 代碼開發層面常見的4個安全問題,包括客戶端數據可信問題、數據和代碼的隔離問題、資源防刷兜底問題,以及敏感數據的處理。5 坑點講解範式「知識介紹->還原業務場景->錯誤實現->正確實現->原理分析->小總結」。
內容簡介本書從整個Java後端研發的視角,通過大量的案例分析日常開發過程中可能遇到的150多個坑點及其解決方案,並討論一些best實踐。這些坑點涵蓋編碼(不僅涉及Java語法層面,還涉及多線程、連接池、資料庫索引、事務、日誌、Spring框架等層面)、系統設計、代碼安全等方面。本書在剖析這些坑點時還會講解排查思路和相關工具的使用,讓讀者不僅能了解常見的坑點,還能具備一定的問題分析能力,以便日後自行排查更多的坑點。
目錄第 1章 Java 8中常用的重要知識點 11 1 在項目中使用Lambda表達式和流操作 11 2 Lambda表達式 21 3 使用Java 8簡化代碼 41 3 1 使用流操作簡化集合操作 41 3 2 使用可空類型簡化判空邏輯 51 3 3 使用Java 8的一些新類、新方法獲得函數式編程體驗 61 4 并行流 81 5 流操作詳解 111 5 1 創建流 121 5 2 filter 141 5 3 map 141 5 4 flatMap 141 5 5 sorted 151 5 6 distinct 151 5 7 skip和limit 151 5 8 collect 161 5 9 groupingBy 171 5 10 partitioningBy 191 6 小結 191 7 思考與討論 19第 2章 代碼篇 232 1 使用了併發工具類庫,並不等於就沒有線程安全問題了 232 1 1 沒有意識到線程重用導致用戶信息錯亂的bug 232 1 2 使用了線程安全的併發工具,並不代表解決了所有線程安全問題 252 1 3 沒有充分了解併發工具的特性,從而無法發揮其威力 282 1 4 沒有認清併發工具的使用場景,因而導致性能問題 302 1 5 小結 322 1 6 思考與討論 322 2 代碼加鎖:不要讓鎖成為煩心事 332 2 1 加鎖前要清楚鎖和被保護的對象是不是一個層面的 352 2 2 加鎖要考慮鎖的粒度和場景問題 362 2 3 多把鎖要小心死鎖問題 372 2 4 小結 402 2 5 思考與討論 402 3 線程池:業務代碼中最常用也最容易犯錯的組件 412 3 1 線程池的聲明需要手動進行 412 3 2 線程池線程管理策略詳解 432 3 3 務必確認清楚線程池本身是不是復用的 472 3 4 需要仔細斟酌線程池的混用策略 482 3 5 小結 512 3 6 思考與討論 512 3 7 擴展閱讀 522 4 連接池:別讓連接池幫了倒忙 542 4 1 注意鑒別客戶端SDK是否基於連接池 552 4 2 使用連接池務必確保復用 602 4 3 連接池的配置不是一成不變的 642 4 4 小結 672 4 5 思考與討論 672 5 HTTP調用:你考慮超時、重試、併發了嗎 682 5 1 配置連接超時和讀取超時參數的學問 692 5 2 Feign和Ribbon配合使用,你知道怎麼配置超時嗎 702 5 3 你知道Ribbon會自動重試請求嗎 732 5 4 併發限制了爬蟲的抓取能力 752 5 5 小結 772 5 6 思考與討論 782 5 7 擴展閱讀 782 6 20%的業務代碼的Spring聲明式事務可能都沒處理正確 802 6 1 小心Spring的事務可能沒有生效 802 6 2 事務即便生效也不一定能回滾 842 6 3 請確認事務傳播配置是否符合自己的業務邏輯 862 6 4 小結 892 6 5 思考與討論 902 6 6 擴展閱讀 932 7 資料庫索引:索引不是萬能葯 942 7 1 InnoDB是如何存儲數據的 952 7 2 聚簇索引和二級索引 962 7 3 考慮額外創建二級索引的代價 972 7 4 不是所有針對索引列的查詢都能用上索引 992 7 5 資料庫基於成本決定是否走索引 1012 7 6 小結 1042 7 7 思考與討論 1042 8 判等問題:程序里如何確定你就是你 1052 8 1 注意equals和==的區別 1062 8 2 實現一個equals沒有這麼簡單 1102 8 3 hashCode和equals要配對實現 1122 8 4 注意compareTo和equals的邏輯一致性 1142 8 5 小心Lombok生成代碼的坑 1152 8 6 小結 1172 8 7 思考與討論 1172 8 8 擴展閱讀 1182 9 數值計算:注意精度、舍入和溢出問題 1192 9 1 「危險」的Double 1202 9 2 考慮浮點數舍入和格式化的方式 1212 9 3 用equals做判等,就一定是對的嗎 1222 9 4 小心數值溢出問題 1232 9 5 小結 1252 9 6 思考與討論 1252 9 7 擴展閱讀 1262 10 集合類:坑滿地的List列表操作 1272 10 1 使用Arrays asList把數據轉換為List的3個坑 1272 10 2 使用List subList進行切片操作居然會導致OOM 1292 10 3 一定要讓合適的數據結構做合適的事情 1322 10 4 小結 1362 10 5 思考與討論 1372 11 空值處理:分不清楚的null和惱人的空指針 1382 11 1 修復和定位惱人的空指針問題 1382 11 2 POJO中屬性的null到底代表了什麼 1422 11 3 小心MySQL中有關NULL的3個坑 1462 11 4 小結 1472 11 5 思考與討論 1472 12 異常處理:別讓自己在出問題的時候變為盲人 1492 12 1 捕獲和處理異常容易犯的錯 1492 12 2 小心finally中的異常 1532 12 3 需要注意JVM針對異常性能優化導致棧信息丟失的坑 1552 12 4 千萬別把異常定義為靜態變數 1572 12 5 提交線程池的任務出了異常會怎樣 1582 12 6 小結 1612 12 7 思考與討論 1622 12 8 擴展閱讀 1632 13 日誌:日誌記錄真沒你想象得那麼簡單 1642 13 1 為什麼我的日誌會重複記錄 1652 13 2 使用非同步日誌改善性能的坑 1692 13 3 使用日誌佔位符就不需要進行日誌級別判斷了嗎 1752 13 4 小結 1762 13 5 思考與討論 1762 13 6 擴展閱讀 1782 14 文件I/O:實現高效正確的文件讀寫並非易事 1802 14 1 文件讀寫需要確保字元編碼一致 1802 14 2 使用Files類靜態方法進行文件操作注意釋放文件句柄 1822 14 3 注意讀寫文件要考慮設置緩衝區 1842 14 4 小結 1872 14 5 思考與討論 1872 14 6 擴展閱讀 1882 15 序列化:一來一回,你還是原來的你嗎 1902 15 1 序列化和反序列化需要確保演算法一致 1912 15 2 MyBatisPlus讀取泛型List JSON欄位的坑 1952 15 3 注意Jackson JSON反序列化對額外欄位的處理 1982 15 4 反序列化時要小心類的構造方法 2002 15 5 枚舉作為API介面參數或返回值的兩個大坑 2012 15 6 小結 2072 15 7 思考與討論 2072 16 用好Java 8的日期時間類,少踩一些「老三樣」的坑 2082 16 1 初始化日期時間 2092 16 2 「惱人」的時區問題 2092 16 3 日期時間格式化和解析 2122 16 4 日期時間的計算 2152 16 5 小結 2172 16 6 思考與討論 2182 16 7 擴展閱讀 2192 17 別以為「自動擋」就不可能出現OOM 2202 17 1 太多份相同的對象導致OOM 2202 17 2 使用WeakHashMap不等於不會OOM 2232 17 3 Tomcat參數配置不合理導致OOM 2272 17 4 小結 2282 17 5 思考與討論 2292 17 6 擴展閱讀 2302 18 當反射、註解和泛型遇到OOP時,會有哪些坑 2312 18 1 反射調用方法不是以傳參決定重載 2312 18 2 泛型經過類型擦除多出橋接方法的坑 2322 18 3 註解可以繼承嗎 2372 18 4 小結 2392 18 5 思考與討論 2392 18 6 擴展閱讀 2412 19 Spring框架:IoC和AOP是擴展的核心 2432 19 1 單例的Bean如何注入Prototype的Bean 2442 19 2 監控切面因為順序問題導致Spring事務失效 2472 19 3 小結 2552 19 4 思考與討論 2552 19 5 知識擴展:同樣注意枚舉是單例的問題 2562 20 Spring框架:幫我們做了很多工作也帶來了複雜度 2582 20 1 Feign AOP切不到的詭異案例 2582 20 2 Spring程序配置的優先順序問題 2642 20 3 小結 2732 20 4 思考與討論 2732 20 5 擴展閱讀 275第3章 系統設計 2813 1 代碼重複:搞定代碼重複的3個絕招 2813 1 1 利用「工廠模式+模板方法模式」,消除if else 和重複代碼 2813 1 2 利用「註解+反射」消除重複代碼 2873 1 3 利用屬性拷貝工具消除重複代碼 2913 1 4 小結 2933 1 5 思考與討論 2933 2 介面設計:系統間對話的語言,一定要統一 2943 2 1 介面的響應要明確表示介面的處理結果 2943 2 2 要考慮介面變遷的版本控制策略 3003 2 3 介面處理方式要明確同步還是非同步 3023 2 4 小結 3053 2 5 思考與討論 3053 2 6 擴展閱讀 3073 3 緩存設計:緩存可以錦上添花也可以落井下石 3073 3 1 不要把Redis當作資料庫 3083 3 2 注意緩存雪崩問題 3093 3 3 注意緩存擊穿問題 3123 3 4 注意緩存穿透問題 3143 3 5 注意緩存數據同步策略 3163 3 6 小結 3173 3 7 思考與討論 3173 3 8 擴展閱讀 3183 4 業務代碼寫完,就意味著生產就緒了嗎 3203 4 1 準備工作:配置Spring Boot Actuator 3213 4 2 健康監測需要觸達關鍵組件 3223 4 3 對外暴露應用內部重要組件的狀態 3273 4 4 指標是快速定位問題的「金鑰匙」 3303 4 5 小結 3393 4 6