java實戰高併發01

同步異步通常用來形容一次方法的調用。
同步:調用者需等到調用返回後再次進行後續動作。
異步:異步方法調用更像一個消息傳遞,一旦開始會立即返回,但實際真實的執行方法通常會在另一個線程中,"真實"的執行。若需要返回結果,這個異步調用真實完成時會通知調用者。

並行併發都可以表示兩個或者多個任務一起執行。
並行:真正意義上的同時執行
併發:偏重於多個任務交替執行,而多個任務之間可能是串行的。

臨界區:用來表示公共資源或者說是共享數據,可以被多個線程使用,但是每一次只能有一個線程使用它,一旦臨界資源被佔用,其他線程想要使用就必須等待。

死鎖:多個線程互相佔用着他人的資源不得釋放
飢餓:一個或者多個線程因爲種種原因始終得不到所需要的資源導致一直無法執行(飢餓相對於死鎖來說未來一段時間可以解決)
活鎖:兩個或者多個線程主動將資源釋放給他人使用,那麼就會出現資源不斷在兩個線程之間跳動沒有一個線程可以同時拿到所有資源而正常執行

併發級別:
由於臨界區的存在,併發的級別可以分類,可以大致分爲阻塞、無飢餓、無障礙、無鎖、無等待

阻塞:一個線程是阻塞的,當其他線程釋放資源之前,當前線程是無法繼續的,當我們使用synchronize或者重入鎖時我們得到的就是線程。無論是synchronize或者衝入鎖都會試圖在執行後續代碼前,得到臨界區的鎖,如果不能得到線程將會掛起知道佔有資源爲止

無飢餓:若線程有優先級高低之別,那麼線程調度總是會傾向於滿足高優先級的線程。如果鎖是公平的滿足先來後到,那麼飢餓就不會產生。

無障礙:無障礙是一種最弱的非阻塞調度,當兩個線程無障礙執行那麼他們不會因爲臨界資源而被掛起,線程都可以進入臨界區,但是當數據被修改,改壞後就會對自己所做的修改進行回滾以確保數據安全。而在多線程中,當臨界區發生嚴重衝突時,所有線程可能都會不斷滾回自己的操作,而使所有線程都走不出臨界區,將嚴重影響系統的正常執行。

無鎖:無鎖並行是無障礙的,無鎖情況下所有線程都能對臨界區進行訪問,不同的是無鎖可以保證必然有一個線程能在有限步內完成操作離開臨界區。(無鎖的算法CAS,這個算法有三個參數CAS(value,expect,new)value是要更新的變量,expect是期望值,new是新值,僅當V?值等於E值時,纔會將V的值設爲N,如果V值和E值不同,則說明已經有其他線程做了更新,則當前線程什麼都不做。最後,CAS返回當前V的真實值。CAS操作是抱着樂觀的態度進行的,它總是認爲自己可以成功完成操作。當多個線程同時使用CAS操作一個變量時,只有一個會勝出,併成功更新,其餘均會失敗。失敗的線程不會被掛起,僅是被告知失敗,並且允許再次嘗試,當然也允許失敗的線程放棄操作。基於這樣的原理,CAS?操作即時沒有鎖,也可以發現其他線程對當前線程的干擾,並進行恰當的處理。

無等待:無鎖要求有一個線程可以在有限步內完成操作,而無等待在無鎖的基礎上更進一步進行擴展。他要求所有線程都必須在有限步內完成,這樣就不會引起飢餓問題。(一種典型結構是RCURead-Copy_Update,它的基本思想是對讀不加控制,因此線程都是無等待的,在寫數據時,先取得原始數據的副本,接着只修改副本數據,修改完成後,在合適的時機回寫數據)。


 

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