併發編程-基礎

在併發要想正確執行須要三要素

  • 原子性
  • 可見性
  • 有序性
 
 

Synchronized關鍵字

synchronized有加鎖的做用,全部的synchronized修飾方法都會順序執行(佔用CPU的順序)
當synchronized關鍵字修飾靜態方法(static)時升級爲類鎖,若是不是靜態方法兩個對象之間沒有關係
  • Synchronized關鍵字執行方式
    • 首先嚐試得到鎖
    • 若是得到鎖,則執行synchronized方法體的內容
    • 若是沒有得到鎖則等待釋放鎖,並不斷嘗試得到鎖,一旦鎖被釋放,多個線程會去嘗試得到鎖,形成鎖競爭
      • 鎖競爭問題,若是在高併發,線程數量高,則會引發CPU佔用高,或者直接宕機
  • 對象鎖同步異步問題?
    • 對象鎖之針對synchronized方法生效,對象中全部的synchronized方法都會同步執行,而非synchronized關鍵字修飾的方法則異步執行
    • 類中有兩個synchronized方法,兩個線程同時調用兩個方法,相互之間是有鎖競爭關係的,由於兩個方法屬於一個對象,咱們加的是對象鎖
  • 髒讀
    • 因爲同步與異步執行的個性,若是不從全局考慮,就很容易引發數據的不一致,這就是髒讀
      • 多線程訪問同一個資源,在線程修改數據的過程當中,有另外的數據來讀取數據,就會引起髒讀
      • 爲了不髒讀咱們必定要肯定修改數據的原子性,而且對讀取數據進行同步控制

Synchronized代碼塊

  • 能夠作更細粒度的
  • 能夠作對象鎖
  • 能夠作類鎖
  • 能夠任意對象鎖
  • 同類型鎖互斥,不一樣類型鎖互不干擾
  • 不要在線程內部修改鎖的引用,引用改變會致使鎖失效,在線程中修改鎖的屬性而不修改鎖的引用則不會失效,不會產生線程安全問題
  • 同一個對象內的多個synchronized方法能夠鎖重入 父子類方法也能夠鎖重入
 
 
    • 一個線程在得到鎖之後執行操做,發生錯誤拋出異常,則自動釋放鎖
    • 能夠利用拋出異常主動釋放鎖
    • 程序異常時主動拋出異常防止死鎖,沒法釋放
    • 若是非主動拋出異常而是程序錯誤拋出的異常釋放鎖可能致使不一致
 
 
是指兩個進程或以上的進程在執行過程當中,因爲競爭資源或者因爲彼此通訊而形成的一種堵塞現象,若無外力做用,他們都將沒法推動下去,
 

線程間的通信


每一個線程都是獨立的運行個體,線程通訊能讓多個線程協同合做
Object類中wait與notify方法能夠實現線程通信
wait與notify必須與synchronized一同使用
wait是釋放鎖的,notify是不釋放鎖的
 
 
Notify只會通知一個wait中的線程,並把鎖給他不會產生鎖競爭問題可是該線程完成以後必須再次notify或者notifyAll,完成相似鏈式操做
notifyAll 會通知全部的wait中的線程,會產生鎖競爭
相關文章
相關標籤/搜索