通讯是指线程之间以何种机制来交换信息。有两种:共享内存和消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,经过读写内存中的公共状态进行隐式通讯。在消息传递的并发模型里,线程之间没有公共状态,线程之间必须经过发送消息来显示进行通讯。java的并发采用的是共享内存模型。java
同步是指程序中用于控制不一样线程间操做发生相对顺序的机制。在共享内存并发模型中,同步是显式进行的。程序员必须显式指定某个方法或某段代码须要在线程之间互斥执行。在消息传递的并发模型里,因为消息的发送必须在消息的接收以前,所以同步是隐式进行的。程序员
在JMM中,若是一个操做执行的结果须要对另外一个操做可见,那么这两个操做之间必需要存在happens-before关系。这里提到的两个操做既能够是一个线程以内的,也能够是在不一样线程之间的。两个操做之间具备happens-before关系,并不意味着前一个操做必需要在后一个操做以前执行。happens-before仅仅要求前一个操做(执行的结果)对后一个操做可见,且前一个操做按顺序排在第二个操做以前(the first is visible to and ordered before the second)。编程