轉載請註明原創出處,謝謝!編程
JAVA服務端或者後端須要大量的高併發計算,因此高併發在JAVA服務端或者後端編程中顯的格外重要了。後端
同步異步是來形容方法的一次調用的,同步必須等等方法調用結束後才能夠繼續後續的操做,而異步方法調用就會返回(真正的執行通常在另一個線程中)就能夠繼續後續操做了。安全
這兩個概念都是表示2個或者多個任務一塊兒執行,而併發側重的是多任務交替執行,就是一個時間點就只有一個任務(時間碎片很小),而並行是真正意義的同時執行(某個時間碎片有大於1個任務在執行)。多線程
臨界區這個概念很是重要,就是多個線程都會操做到的,是一個公共資源或者共享的數據,可是每次操做只能一個線程使用而一旦臨界區資源被佔用其餘的線程必須等待該資源的釋放,在並行程序中,臨界區資源都是受保護的,若是不保護就會出現問題,達不到預期的效果。併發
阻塞和非阻塞是形容多個線程之間的相互影響的(前提是多個線程而不是一個),一個線程佔用了臨界區資源那麼其餘線程必須在臨界區以外等待,阻塞是操做系統層面掛起,上下文切換了,因此性能不高。阻塞若是一個線程一直佔用不釋放資源,那麼其餘須要該臨界區資源都必須一直等。非阻塞就是運行多個線程同時進入臨界區,只要保證不把數據修改壞就行。異步
因爲臨界區的存在,多線程併發必須受到控制。
根據控制併發的策略,大概能夠分爲一下幾種:
阻塞、無飢餓、無障礙、無鎖、無等待。高併發
阻塞上面已經解釋了。性能
因爲線程直接的具備優先級,若是線程調度會優先調用優先級高的,那麼優先級低的可能一直沒法執行,就會飢餓,若是鎖是公平的,都是按照新進先出就不存在飢餓了就是無飢餓。操作系統
無障礙,阻塞實際上是悲觀鎖,就是多線程一塊兒修改臨界區數據可能會被修改壞,因此每次只能一我的進行修改,其餘須要等待,而無障礙的表示的一種非阻塞調度,他是一種樂觀鎖,他任務多個線程一塊兒修改臨界區數據也未必會把臨界區數據修改壞,因此能夠放開讓多線程都進來,一種寬進嚴出的策略。若是發現一個線程在臨界區操做遇到數據競爭,產生衝突,他就會回滾操做,進行重試,可能會出現死鎖的狀況 a依賴b b依賴a 都不斷重試。線程
無鎖,是在無障礙的前提上面加一個約束,就是保證有一個線程能夠勝出的,可能存在飢餓問題。
無等待,是在無鎖的前提上面加一個約束,就是保證全部線程均可以在有限步內完成。
JAVA的內存模型(JMM),因爲併發程序比串行程序複雜不少,在併發程序下,數據訪問一致性和安全性該如何保證呢?因此還須要在定義一些規則,保證多線程之間能夠有效地、正確地協同工做,而JMM就是爲此而生的。
JMM關鍵技術點都是圍繞多線程的原子性、可見性、有序性來創建的。
關於JMM的原子性、可見性、有序性後續併發系列都會詳細解釋。
我的公衆號