Java併發編程實戰筆記(1)-線程安全簡介

轉載請註明出處 http://www.paraller.com
原文排版地址 點擊獲取更好閱讀體驗緩存

多線程簡介

進程出現的緣由

資源利用率

程序在等待操做執行完成的空檔,運行另外一個程序 提升資源利用率。安全

公平性

用戶對於計算機的使用權,經過粗粒度的時間分片 使得用戶和程序共享資源程序。多線程

便利、效率性

一個任務分解多個子任務,必要時通訊共同完成任務。異步

異步事件的簡單處理

對於單線程而言,若是要高效處理多個操做,必須使用非阻塞IO,複雜且易錯,若是可以爲每一個請求分配線程將下降開發的難度性能

線程容許在同一個進程中同時存在多個程序控制流,線程會共享進程中的資源;每一個線程有各自的 程序計數器、棧、局部變量。同一個進程中的多個線程也能夠被同時調度到多個CPU上運行。優化

多線程的風險

安全性

對共享的可變的變量進行沒法預測順序的操做,將會形成與預期不一致的結果。線程

活躍性

某個操做沒法繼續進行下去:A線程佔有資源長時間不釋放,致使B線程沒法繼續操做code

額外的性能開銷:
  • 線程調度器,頻繁的上線文切換
  • 線程共享數據/使用同步機制:抑制編譯器的優化、緩存失效、共享內存總線的同步流量對象

線程安全性

核心在於: 避免多線程同時訪問可變狀態進程

核心知識點

  • 編寫線程安全代碼的核心在於:對共享 可變的狀態訪問操做進行管理
  • 狀態能夠是數據,也能夠是其餘依賴的對象(好比HashMap自身或者Map.Entry對象)
  • 存在多個線程訪問,多個線程修改,必須使用同步
  • 線程安全類的定義: 多個線程訪問某個類時,類始終表現出正確的行爲

競態條件: 於不恰當的執行順序,而出現不正確的結果.

  • 常見類型 "先檢查再執行"
  • 經過原子性原理解決 ,好比 複合操做.
  • concurrent包中包含了原子變量類.

加鎖機制

  • 同步代碼塊將包括兩個部分: 一個做爲鎖的對象引用;一個做爲由這個鎖保護的代碼塊
  • 正常路徑退出 和 拋出異常退出,都將釋放鎖
  • 重入:線程獲取本身持有的鎖,請求會得到成功

    • 獲取鎖的操做粒度是 "線程",不是"調用"
    • 一種實現方法是爲每一個鎖關聯 一個計數器和一個全部者線程.
  • 經過縮小同步代碼塊的範圍,能夠在性能和同步間找到平衡
  • 一種常見的加鎖約定:經過將狀態封裝在對象內,經過同一個對象鎖,對狀態的讀寫訪問都添加鎖來確保安全
  • 用同步來協調對一個變量的訪問

    • 在訪問這個變量的全部位置上都須要同步
    • 全部位置上都必須使用同一個鎖
    • 不只寫入須要,讀取也須要同步
  • 當執行長時間計算和沒法快速完成的操做,時,必定不要持有鎖或者要設置定時鎖(Redisson)

活躍性和性能

  • 經過縮小同步代碼塊的範圍來保持二者平衡
相關文章
相關標籤/搜索