<bdo id="ks4iu"><del id="ks4iu"></del></bdo>
  • 
    <pre id="ks4iu"></pre>
  • <bdo id="ks4iu"><del id="ks4iu"></del></bdo>
    <input id="ks4iu"><em id="ks4iu"></em></input>
    
    
  • <center id="ks4iu"><cite id="ks4iu"></cite></center>
  • 首頁 > 智能影音 >

    世界速訊:JAVA編程規范之并發處理

    1、【強制】獲取單例對象需要保證線程安全,其中的方法也要保證線程安全。

    說明 : 資源驅動類、工具類、單例工廠類都需要注意。


    (資料圖片)

    2、【強制】創建線程或線程池時請指定有意義的線程名稱,方便出錯時回溯。

    3、【強制】線程資源必須通過線程池提供,不允許在應用中自行顯式創建線程。

    說明 : 使用線程池的好處是減少在創建和銷毀線程上所花的時間以及系統資源的開銷,解決資源不足的問題。如果不使用線程池,有可能造成系統創建大量同類線程而導致消耗完內存或者“過度切換”的問題。

    4、【強制】線程池不允許使用 Executors 去創建,而是通過 ThreadPoolExecutor 的方式,這樣的處理方式讓寫的同學更加明確線程池的運行規則,規避資源耗盡的風險。

    說明 : Executors 返回的線程池對象的弊端如下:

    -FixedThreadPool 和 SingleThreadPool:

    允許的請求隊列長度為 Integer.MAX_VALUE,可能會堆積大量的請求,從而導致 OOM。

    -CachedThreadPool 和 ScheduledThreadPool:

    允許的創建線程數量為 Integer.MAX_VALUE,可能會創建大量的線程,從而導致 OOM。

    5、【強制】SimpleDateFormat 是線程不安全的類,一般不要定義為 static 變量,如果定義為 static,必須加鎖,或者使用 DateUtils 工具類。

    6、【強制】高并發時,同步調用應該去考量鎖的性能損耗。能用無鎖數據結構,就不要用鎖;能鎖區塊,就不要鎖整個方法體;能用對象鎖,就不要用類鎖。

    7、【強制】對多個資源、數據庫表、對象同時加鎖時,需要保持一致的加鎖順序,否則可能會造成死鎖。

    說明 : 線程一需要對表 A、B、C 依次全部加鎖后才可以進行更新操作,那么線程二的加鎖順序也必須是 A、B、C,否則可能出現死鎖。

    8、【強制】并發修改同一記錄時,避免更新丟失,需要加鎖。要么在應用層加鎖,要么在緩存加鎖,要么在數據庫層使用樂觀鎖,使用 version 作為更新依據。

    說明 : 如果每次訪問沖突概率小于 20%,推薦使用樂觀鎖,否則使用悲觀鎖。樂觀鎖的重試次數不得小于 3 次。

    9、【強制】多線程并行處理定時任務時,Timer 運行多個 TimeTask 時,只要其中之一沒有捕獲拋出的異常,其它任務便會自動終止運行,使用 ScheduledExecutorService 則沒有這個問題。

    10、【推薦】使用 CountDownLatch 進行異步轉同步操作,每個線程退出前必須調用 countDown 方法,線程執行代碼注意 catch 異常,確保 countDown 方法可以執行,避免主線程無法執行至 await 方法,直到超時才返回結果。

    說明 : 注意,子線程拋出異常堆棧,不能在主線程 try-catch 到。

    11、【推薦】避免 Random 實例被多線程使用,雖然共享該實例是線程安全的,但會因競爭同一 seed 導致的性能下降。

    說明 : Random 實例包括 java.util.Random 的實例或者 Math.random() 的方式。

    正例 : 在 JDK7 之后,可以直接使用 API ThreadLocalRandom,而在 JDK7 之前,需要編碼保證每個線程持有一個實例。

    12、【推薦】在并發場景下,通過雙重檢查鎖(double-checked locking)實現延遲初始化的優化問題隱患(可參考 The "Double-Checked Locking is Broken" Declaration),推薦問題解決方案中較為簡單一種(適用于 JDK5 及以上版本),將目標屬性聲明為 volatile 型。

    13、【參考】volatile 解決多線程內存不可見問題。對于一寫多讀,是可以解決變量同步問題,但是如果多寫,同樣無法解決線程安全問題。如果是 count++操作,使用如下類實現:AtomicInteger count = new AtomicInteger(); count.addAndGet(1); 如果是 JDK8,推薦使用 LongAdder 對象,比 AtomicLong 性能更好(減少樂觀鎖的重試次數)。

    14、【參考】 在容量不夠進行 resize 時由于高并發可能出現死鏈,導致 CPU 飆升,在開發過程中可以使用其它數據結構或加鎖來規避此風險。

    15、【參考】ThreadLocal 無法解決共享對象的更新問題,ThreadLocal 對象建議使用 static 修飾。這個變量是針對一個線程內所有操作共有的,所以設置為靜態變量,所有此類實例共享此靜態變量,也就是說在類第一次被使用時裝載,只分配一塊存儲空間,所有此類的對象(只要是這個線程內定義的)都可以操控這個變量。

    如若轉載,請注明出處:開源字節 https://sourcebyte.cn/article/191.html

    責任編輯:Rex_08

    推薦閱讀
    欧美国产在线一区,免费看成年视频网页,国产亚洲福利精品一区,亚洲一区二区约美女探花
    <bdo id="ks4iu"><del id="ks4iu"></del></bdo>
  • 
    <pre id="ks4iu"></pre>
  • <bdo id="ks4iu"><del id="ks4iu"></del></bdo>
    <input id="ks4iu"><em id="ks4iu"></em></input>
    
    
  • <center id="ks4iu"><cite id="ks4iu"></cite></center>
  • 主站蜘蛛池模板: 四虎永久在线观看视频精品 | 中文字幕亚洲欧美日韩在线不卡| 国产边打电话边被躁视频| 欧美另类精品xxxx人妖换性| 日本肉漫在线观看| 国产极品美女高潮无套在线观看| 亚洲午夜久久久久久久久电影网 | 麻豆久久婷婷综合五月国产| 日韩伦人妻无码| 国产午夜免费福利红片| 久久亚洲精品无码观看不卡| 隔壁女邻居在线观看| 欧美成人家庭影院| 国产精品国产三级在线专区| 亚洲喷奶水中文字幕电影| 丝袜情趣在线资源二区| 最近2019好看的中文字幕 | 91香蕉在线观看免费高清| 精品国产杨幂在线观看| 日本黄色一级视频| 国产一二三视频| 一级一级一级毛片免费毛片| 福利区在线观看| 性一交一乱一伦一色一情| 免费看国产曰批40分钟| a级国产乱理伦片在线观| 综合91在线精品| 女人18毛片a级毛片免费| 午夜福利视频合集1000| www.激情小说| 欧美重口绿帽video| 国产男女野战视频在线看| 久久国产精品久久精品国产 | 极品美女养成系统| 国产三级精品三级在专区中文| 丁香六月综合网| 精品欧美一区二区三区久久久| 天堂资源bt在线官网| 亚洲午夜电影网| 贵妇的变态yin乱| 日本免费a级毛一片|