同步方法調用一旦開始,調用者必須等待方法調用返回後才能繼續後續行爲。異步方法調用更像一個消息傳遞,一旦開始就當即返回,調用者就能夠繼續後續的操做。而被調用的異步方法會在另一個線程裏真實地執行。若是異步調用須要返回結果,那麼當這個調用真實完成的時候,則會通知調用者。安全
這兩個概念很是容易被混淆,它們均可以表示多個任務一塊兒執行,但併發偏重於多個任務交替執行,而多個任務之間可能仍是串行,讓外部的觀察者看起來像是並行;而並行是真正意義上的同時執行。多線程
實際上,若是系統內只有一個單核 CPU,那麼多線程或者多進程任務不多是真實並行的,畢竟一個 CPU 一次只能執行一條指令,這樣只能叫作併發而不是並行;真實的並行只可能出如今多個單核和/或者多核 CPU 中。併發
臨界區表示一種公共資源,能夠被多個線程使用。可是每一次只能有一個線程使用它,一旦臨界區資源被佔用,其餘線程想要使用它就必須等待。異步
一般用來形容多個線程之間的相互影響。好比一個線程佔用了臨界區資源,那麼其餘全部須要這個資源的線程就必須等待,直到這個線程釋放了這個資源。這種狀況就是阻塞;非阻塞表明沒有一個線程能夠妨礙其餘線程執行,全部的現成都會嘗試不斷執行下去。高併發
多個線程佔有了其每一個線程都須要的資源,你不讓我我不讓你,形成程序沒法繼續執行下去,這就是死鎖;飢餓是指某個或多個線程一直等不到所需的資源致使一直沒法執行,或者一個線程一直佔有資源不釋放,其他線程一直在嘗試獲取這個資源;活鎖是指每一個線程都主動地將資源釋放給別人用,那麼就沒有任何一個線程可以順利佔有這個資源執行。線程
一個線程是阻塞的,那麼在其餘線程釋放以前,這個線程是沒法執行的。設計
若是鎖是公平的,無論新來的線程優先級有多高,想要得到資源,也必須排隊等待前面有可能優先級比較低的先使用資源,這樣全部的線程都有機會執行。進程
多個進程能夠一塊兒進入臨界區獲取資源。爲了不在資源被多個線程修改致使一致性問題發生,其每一個線程會在修改資源後進行回滾操做確保數據安全。可是依然會有一個問題就是資源修改的衝突特別大的時候,會致使每一個線程一直在回滾,沒有一個線程可以走出臨界區。資源
無鎖的並行都是無障礙的,但不一樣的是無鎖的併發保證了必然有一個線程可以在有限步驟內離開臨界區。同步
無等待是要求全部的無障礙線程必須所有在有限步驟內離開臨界區,這樣就不會遇到飢餓問題。
(未完待續)
實戰 Java 高併發程序設計 第一章 走入並行世界 讀書筆記
歡迎加入咖啡館的春天(338147322)。