通訊是指線程之間以何種機制來交換信息。有兩種:共享內存和消息傳遞。在共享內存的併發模型裏,線程之間共享程序的公共狀態,經過讀寫內存中的公共狀態進行隱式通訊。在消息傳遞的併發模型裏,線程之間沒有公共狀態,線程之間必須經過發送消息來顯示進行通訊。java的併發採用的是共享內存模型。java
同步是指程序中用於控制不一樣線程間操做發生相對順序的機制。在共享內存併發模型中,同步是顯式進行的。程序員必須顯式指定某個方法或某段代碼須要在線程之間互斥執行。在消息傳遞的併發模型裏,因爲消息的發送必須在消息的接收以前,所以同步是隱式進行的。程序員
在JMM中,若是一個操做執行的結果須要對另外一個操做可見,那麼這兩個操做之間必需要存在happens-before關係。這裏提到的兩個操做既能夠是一個線程以內的,也能夠是在不一樣線程之間的。兩個操做之間具備happens-before關係,並不意味着前一個操做必需要在後一個操做以前執行。happens-before僅僅要求前一個操做(執行的結果)對後一個操做可見,且前一個操做按順序排在第二個操做以前(the first is visible to and ordered before the second)。編程